Habe in einem bestehenden Projekt eine Funktion, in der am Anfang aus einem "Object" ein "Window" konstruiert wird: void GraphicsWnd::auto_created(std::string template_name, Object object) { Window mywnd(object); ... Nun habe ich aber das Problem, dass ich dieses "Window" "später" noch brauche. Dafür habe ich als ersten Versuch in die Klasse "GraphicsWnd" eine "globale" Variable eingefügt: Window wnd; Und somit sieht die Funktion jetzt so aus, und das funktioniert natürlich: void GraphicsWnd::auto_created(std::string template_name, Object object) { Window mywnd(object); wnd = mywnd; ... Ist aber unschön. Hatte gedacht, es würde nun auch so gehen: void GraphicsWnd::auto_created(std::string template_name, Object object) { wnd(object); ... Kompiliert aber nicht. Und das hier kompiliert, funktioniert aber natürlich nicht, da das "globale" "wnd" dann leer bleibt: void GraphicsWnd::auto_created(std::string template_name, Object object) { Window wnd(object); ... Die Konstruktion ist in der "Window" Klasse so definiert. Glaube zumindest, dass es die richtige Stelle ist: // Construct a Window from an Object that refers to a Window Window(const Object &other) : ShowFullObject(other) {check_toolbox_class(Window::TOOLBOX_CLASS);} Kann mir jemand erklären, wie diese Konstruktion überhaupt funktioniert?
Deine lokale Window Variable geht ja am Ende der Funktion verloren. Ich hätte die Klassenvariable als Pointer auf ein Window angelegt und in der Funktion dann so etwas wie wnd = new Window(obj) ; geschrieben.
Lothar schrieb: > Und somit sieht die Funktion jetzt so aus, und das funktioniert > natürlich: > > void GraphicsWnd::auto_created(std::string template_name, Object object) > { > Window mywnd(object); > wnd = mywnd; > ... > > Ist aber unschön. Warum? > Hatte gedacht, es würde nun auch so gehen: > void GraphicsWnd::auto_created(std::string template_name, Object object) > { > wnd(object); > ... > > Kompiliert aber nicht. Nein. Du müsstest dann schreiben:
1 | wnd = Window(object); |
Das macht das gleiche wie die erste Variante, nur auf eine Anweisung zusammengezogen.
Rolf M. schrieb: > Warum? Weil es globalen Zustand in das Programm einfügt, wo keiner benötigt wird. Die Lösung hier ist wie schon erwähnt, dass du eine Heap-Allokation benutzen musst (mit new) um die Lebenszeit des Objekts selbst kontrollieren zu können. Sinnvollerweise verwendet man dazu den geigneten automatischen Pointer, in diesem Fall vermutlich std::shared_ptr<Window> bzw. std::make_shared<Window>(...) zum Anlegen des Objekts.
Sven B. schrieb: > Rolf M. schrieb: >> Warum? > > Weil es globalen Zustand in das Programm einfügt, wo keiner benötigt > wird. Das täte die zweite von mir zitierte Variante aber auch, wenn sie so funktionieren würde, wie der TE sich das vorstellt. Die Frage war, warum das erste unschön ist, das zweite aber nicht. Dass eine globale Variable an sich hier unschön ist, da stimme ich dir zu.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.