Forum: PC-Programmierung C++ OOP Frage


von Lothar (Gast)


Lesenswert?

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?

von Andreas R. (daybyter)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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
Noch kein Account? Hier anmelden.