D_Main: Zugriff auf deren Objekte
-
Zum Anlegen des Objekts auf dem Heap brauche ich auf alle Fälle immer "gcnew" oder? (gorbage collector-Variante von new)
Ich nehme an, die interessiert nicht in 1. Linie, wo das Objekt tatsächlich im Speicher liegt (Heap, Managed Heap, ...) sonder vielmehr, wie die Lebenszeit geregelt ist.
// demo und demo1 werden beide automatisch "verwaltet", jedoch // auf unterschiedliche Art. { Demo^ demo = gcnew Demo; demo->f(); // Wenn keine Referenzen auf demo mehr bestehen, wird das Objekt vom // GC eingesammelt und irgendwann aufgeräumt. Das Objekt, wenn Referenzen // darauf herumgereicht werden, kann immer noch verwendet werden. Wird // delete demo ruft demo->Dispose() auf (falls vorhanden). Der Speicher wird // dann vom GC irgendwann freigegeben. Das Objekt ist logisch ungültig. } { Demo demo1; demo1.f(); // Wenn der Scope verlassen wird, wird automatisch delete demo1; aufgerufen, // was zur Folge hat, dass Dipose(), falls vorhanden, aufgerufen wird. // Das Objekt kann nicht mehr verwendet werden, da nach dem Aufruf vom // Dispose das Objekt (logisch) ungültig ist. }
Ich habe nicht die Möglichkeit, auf eine Klasse mit static-Methoden ohne gcnew auf die Methoden zuzugreifen?
Doch, denn sie sind ja static. Du benötigst kein Objekt von der Klasse.
Bsp:using namespace System; ref class Demo { public: void nonStaticMemberFunction() { } static void staticMemberFunction() { } }; int main(array<System::String ^> ^args) { Demo^ demo = gcnew Demo; demo->nonStaticMemberFunction(); Demo::staticMemberFunction(); return 0; }
-
Erstmal danke für die schnelle Antwort, echt spitze.
Wird wohl meine C++/Cli-Fragen Anlaufstelle werdenWürde folgender Methoden-Aufruf funktionieren?
using namespace System; ref class Demo { public: static void staticMemberFunction() { } }; int main(array<System::String ^> ^args) { Demo::staticMemberFunction(); return 0; }
Also ohne das ich das Object mit gcnew Demo auf dem managed-Heap erzeuge?
-
ja
-
Im Konstruktor von "D_Main" (Main-Form) speichere ich nun den this-Zeiger in eine static-Variable (static D_Main Instance).
Der Zugriff mit "D_Main::Instance" von einem anderen Objekt aus klappt nun einwandfrei.
Was ist aber, wenn das Object "D_Main" vom gc automatisch einmal verschoben wird?
Wäre hier nicht eine Tracking-Referenz auf "D_Main" vorteilhafter?
Wenn ja, wie deklariere ich diese richtig?
static D_Main^% this ???Grüße
Stefan
-
Nicht static!!!
Warum auch...Das Tracking Handle (^) ist auch gemanagt... Du brauchst keine Tracking Reference.
Simon
-
Hier mal ein Abschnitt meines Codes:
public ref class D_Main : public System::Windows::Forms::Form { public: static D_Main^ Instance; // Konstruktor public: D_Main(void) { Instance = this; } };
Nun kann ich von anderen Klassen mit "D_Main::Instance" auf sämtliche Elemente von D_Main zugreifen.
Wenn der gc nun D_Main verschieben würde, gäbe es kein Problem, denn meine Variable "Instance" ist ja auch gemannaged.
Habe ich das so richtig verstanden?
-
Nein, komplett verkehrt!
1. Kümmere dich erstmal nicht um den GC. Es gibt fälle wo es manchmal wichtig ist, aber hier nicht!
2. Übergib eine Referenz eines D_Main Objekts an das Objekt, welches es benötigt. Konkret: Über gib beim erzeugen des D_TestDialog Objekts die Referenz auf dein D_Main Objekt. Wenn Du D_TestDialog in D_Main erzeugst ist das eben this.Das was Du gemacht hast, läuft hin zu globalen Variabeln und das ist selten gut.
Simon
-
Ich habe eine separate cpp-Datei, inder ich eine Funktion habe die mir z.B. das Aussehen vom D_Main-Formular ändert. (Position, Größe etc)
In dieser Funktion werden die Einstellungen geladen und entsprechend wird das D_Main-Formular angepasst.
Empfiehlt es sich dieser Funktion den this-Zeiger direkt zu übergeben?Funktion in der Global.cpp:
bool Chaping::Settings::CConfig::LoadData() { //... }
Wie gebe ich hier die Parameterliste richtig an, um einen this-Zeiger zu übergeben?
LoadData( D_Main^ Instance) ???
-
-