C++ OOP Frage

Gast #6394901
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?
#6394951
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.
#6394976
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.
#6395121
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.