eigene Klassen als Parameter

  • C++/CLI

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Pinki.

    eigene Klassen als Parameter

    Hallo, ich habe eine CLI DLL, nun aber möchte ich das ich nicht 7 oder mehr Parameter in einer Funktion habe, diese in einer Klasse zusammenfassen. Von C++ aus geht das auch, aber in .Net kommt Diese Sprache wird nicht unterstützt, warum auch immer

    @Administration: ein C++/CLI Label wäre sinvoll.

    *Topic verschoben*
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Header

    C-Quellcode

    1. public ref class dwRectangle
    2. {
    3. public:
    4. float top;
    5. float left;
    6. float right;
    7. float bottom;
    8. float X;
    9. float Y;
    10. float Width;
    11. float Height;
    12. dwRectangle(float X, float Y, float Width, float Height);
    13. dwRectangle();
    14. ~dwRectangle();
    15. };


    Source

    C-Quellcode

    1. dwRectangle::dwRectangle(float X, float Y, float Width, float Height)
    2. {
    3. this->X = X;
    4. this->Y = Y;
    5. this->Width = Width;
    6. this->Height = Height;
    7. }
    8. dwRectangle::dwRectangle()
    9. {
    10. }
    11. dwRectangle::~dwRectangle(void)
    12. {
    13. }

    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Sollte so gehen. Ausserdem packt man keine public Variablen in eine Klasse, dafür gibt's Properties. Warum ist dein Kon/Destruktor leer? Wieso soeine Klasse? Es gibt doch schon die Rectangle-Klasse. Wieso überhaupt CLI wenn's kein Wrapper ist?

    Gonger96 schrieb:

    Ausserdem packt man keine public Variablen in eine Klasse, dafür gibt's Properties. Warum ist dein Kon/Destruktor leer? Wieso soeine Klasse? Es gibt doch schon die Rectangle-Klasse. Wieso überhaupt CLI wenn's kein Wrapper ist?

    Was geht nicht? Gibt es eine Fehlermeldung? Das was ich da sehe ist kein Wrapper, dann poste doch bitte alle relevanten Header (Quellcodedateien erstmal nicht).

    Andy16823 schrieb:

    aber in .Net kommt Diese Sprache wird nicht unterstützt
    Kannst Du mal den Code sdazu posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Code tut ja nichts zur Sache, sobald ich eine ref Class habe nimmt er es nicht mehr an. Habe auch versucht das ganze in einem Neuem Projekt zu machen, das ergebniss war leider das selbe. Lasse ich das ref weg, nimmt er die Klasse als Parameter an. Aber ich kann diese nicht Instanzieren und auch keine Daten in der Klasse Speichern.

    Das ganze ist für einen Direct2D Wrapper.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Doch der Code tut was zur Sache. Eine ref Klasse kannst du ganz normal instanzieren Klasse^ test = gcnew Klasse();. Wobei ein Rectangle lieber eine value Klasse sein sollte. Also poste deinen Code, gib uns ein Beispiel in dem dein Fehler auftritt, ansonsten können wir nicht helfen. Wie gesagt die Header reichen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    Andy16823 schrieb:

    sobald ich eine ref Class habe nimmt er es nicht mehr an
    Mit welchem Code?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok gut, dann mal hier die Hauptklasse

    C-Quellcode

    1. // Direct2DWrapper.h
    2. #pragma once
    3. #include <d2d1.h>
    4. #include "dwBrush.h"
    5. #include "dwRectangle.h"
    6. using namespace System;
    7. namespace Direct2DWrapper {
    8. public ref class Graphics
    9. {
    10. private:
    11. ID2D1Factory* d2dfact;
    12. HWND Container;
    13. ID2D1HwndRenderTarget* GraphicsTarget;
    14. public:
    15. Graphics();
    16. void CreateGraphics(IntPtr hWndl);
    17. void dwDispose();
    18. void CreateRectangle(float X, float Y, float Width, float Height, dwRectangle Source);
    19. void dwDrawRectangle(float Top, float Left, float Right, float Bottom, float Stroke, float Red, float Green, float Blue);
    20. void dwDrawEllipse(float X, float Y, float xRadius, float yRadius, float Stroke, float Red, float Green, float Blue);
    21. void dwDrawBitmap(System::String^ path, float Top, float Left, float Right, float Bottom, float Width, float Height);
    22. void dwFillRectangle(dwRectangle rect, System::Drawing::Color Color);
    23. };
    24. }


    und dann hier mit vb.net der Code

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim ofd As New OpenFileDialog
    3. Dim Graphics As New Direct2DWrapper.Graphics()
    4. Graphics.CreateGraphics(Me.Panel1.Handle)
    5. Graphics.dwDrawRectangle(10, 10, 10, 10, 10, Color.Green.R, Color.Green.G, Color.Green.B)
    6. Graphics.dwDrawEllipse(Me.Panel1.Width / 2, Me.Panel1.Height / 2, 50, 50, 2, Color.Yellow.R, Color.Yellow.G, Color.Yellow.B)
    7. Dim rect As New Direct2DWrapper.dwRectangle(0, 0, 50, 50)
    8. Graphics.dwFillRectangle(rect, Color.Yellow)
    9. End Sub


    Im Anhang noch ein Bild
    Bilder
    • rect.JPG

      156,52 kB, 1.280×992, 164 mal angesehen
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Vielen dank es Funktioniert, aber was ist der Unterschied zwischen einer ref und einer value Klasse und was hat das ^ und das * zu bedeuten ??
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Andy16823 schrieb:

    ref und einer value Klasse und was hat das ^ und das * zu bedeuten ?
    ref class ist eine Klasse von Managed C++ im Gegensatz zu unmanaged C++, "value class" gibt es nicht.
    ^ ist eine Referenz auf ein managed Objekt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nativ
    Managed
    *
    ^
    &
    %
    new
    gcnew

    Das sind aber Grundlagen, diese erstmal lernen bevor man an soeinen recht großen Wrapper herangeht.

    /Edit
    Gib deinen Speicher im Destruktor frei, nicht mit einer extra Methode. Der Compiler lässt dann direkt IDisposeable implementieren.