Forum: PC-Programmierung C++ OOP Frage


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lothar (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:
   wnd = Window(object);

Das macht das gleiche wie die erste Variante, nur auf eine Anweisung 
zusammengezogen.

von Sven B. (scummos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.