Unterscheid zwischen * und ^



  • Hallo ich habe schon einige Zeit C++ Erfahrung, kenne mich auch schon mit Objektorientierung aus. Nun bin ich von Borland Builder zu Microsoft Visual C++ 2010 Express gewechselt.

    So wollte durch einen Buttonklick, ganz objektorientiert, ein zweites Fenster öffnen

    private: System::Void NewButton_Click(System::Object^  sender, System::EventArgs^  e)
    			 {
    				 CreateCar *NewWindow= new CreateCar;
    				 NewWindow->ShowDialog();
    			 }
    

    das funktionierte leider nicht. Habe aber dann herausgefunden wie es geht

    private: System::Void NewButton_Click(System::Object^  sender, System::EventArgs^  e)
    			 {
    				 CreateCar ^NewWindow= gcnew CreateCar;
    				 NewWindow->ShowDialog();
    			 }
    

    jetzt ist die frage ist ^ auch sowas wie ein Zeiger und das gcnew dem new gleich zusetzten. Und was ist der Unterschied.



  • Das ist allerdings kein C++ sondern C++/CLI. Immerhin hast du aber sofort im richtigen Unterforum gepostet. Respekt. 🙂

    Ich selber komme aus dem reinen C++ Bereich und kann daher nur vermuten. Ich denke, dass new den Speicher anfordert und nicht auf ihn "aufpasst". Das heißt rr wird nicht automatisch wieder freigegeben, das musst du dann zur geeigneten Zeit selber tun. Ansonsten hast du Speicherleaks.

    Wohingegen du mit gcnew Speicher anfordern kannst, der durch den GC (Garbage Collector) wieder freigegeben wird, wenn er nicht mehr benötigt wird.

    Im übrigen glaube ich, dass C++/CLI für "richtige" Anwendungen nicht gemacht wurde. Da solltest du dir das reine C++ ansehen oder sogar noch besser die Sprache C#. Das funktioniert ähnlich und hat auch einen Garbage Collector und du kannst Anwendungen mit GUI (Grafische Oberfläche) erstellen.



  • Richtig, * stehen für Zeiger, ^ stehen für so genannte managed references. Dabei handelt es sich sehr vereinfacht gesagt ebenfalls um Zeiger, deren Existenz aber dem System bzw. dem Garbage Collector bekannt ist, wodurch dieses dir als Entwickler die gesamte Verwaltung abnehmen kann.

    Dies wird dadurch erreicht, dass das System selbst merkt, wenn ein Objekt nicht mehr gebraucht wird, indem keine relevanten managed references, auch bekannt unter dem Namen Root Set, gefunden werden können.

    Der Wert des verwalteten Zeigers kann sich im Übrigen zur Laufzeit ändern, ohne dass du davon etwas mitbekommst, weil dies für bestimmte Aufgaben der Speicherverwaltung von Vorteil sein kann (Stichwort Fragmentierung). Gerade darum ist es wichtig, eindeutig zwischen normalen und managed Zeigern unterscheiden zu können.

    Es gibt möglichkeiten, native Zeiger auf verwaltete Objekte zu benutzen, allerdings ist dies nur in ganz bestimmten Fällen notwendig und auch sinnvoll. Darum: Wenn du mit .NET Klassen programmierst (alles im Namensraum System ), kannst du entweder gar keine Zeiger (dort musst du noch einige Dinge beachten, darum rate ich dir davon eher ab, solange du mit .NET noch unerfahren bist ;)) oder managed Zeiger benutzen.

    MfG



  • Wo bei ich schon denke das du mit MV C++ Visual Studio Express komplexe Anwendungen mit grafischer Oberfläche ausgelegt ist. Mich interessieren noch 2 Sachen. 1. Wie kann man MV C++ Visual Studio Express die Programmierhilfe aufrufen das automatisch nach einem -> einem die verfügbaren Atribute und Methoden angezeigt werden. Und als 2 wie kommt an den GC heran?



  • 1. Die IDE baut eine Datenbank auf.
    2. Die .NET Runtime (CLR) hat einen GC. gcnew teilt dem GC mit wann / wo Speicher angefordert wurde.



  • Hallo Hans,

    C++/CLI ist trotzdem nicht für grafische Programmierung geeignet, s. mit als "Wichtig" markierten ersten Beitrag hier im Subforum: http://www.c-plusplus.net/forum/viewtopic-var-t-is-263084.html

    Wenn du weiter C++ programmieren willst, dann nimm dir ein anderes Framework (z.B. Qt, wxWidgets, etc., s.a. http://www.c-plusplus.net/forum/viewtopic-var-t-is-230583.html).

    Wenn du jedoch .NET lernen willst, dann steige auf C# um...


Anmelden zum Antworten