www.mikrocontroller.net

Forum: Compiler & IDEs Constructor Problem


Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ...

Angenommen ich hab eine Klasse wie
class bla1 {
public:
    bla1();
    ~bla1();
};

und

class bla2 {
public:
    bla2();
    ~bla2();

private
    bla1     m_meinbla1;
};

bla2::bla2() {
    PortsInitialisieren();
}

und ich erzeuge ein Objekt meiner Klasse bla2 mittels:
int main() {
  bla2 meinbla2 = bla2();
  for(;;) {}
}

Jetzt die große Frage - wird der Constructor von bla1 beim Erzeugen des
Objektes bla2 auch noch gleich aufgerufen, weil ja bla1 auch erzeugt
wird?

Und ich nehme an, dass das bereits noch vor PortsInitialisieren()
(siehe constructor bla2) passiert?

Falls das so ist, wäre das nicht so besonders toll ...
Mein Problem ist, dass ich eine LCD-Klasse habe und laut dem
AVR-Simulator wird gleich der Konstructor der LCD-Klasse aufgerufen
bevor die Ports im Constructor der Hauptklasse (hier bla2)
initialisiert werden ... Eine Lösung wäre eine zweistufige
Initialisierung (Constructor + Init()-Methode) ...

Weiß da jemand was genaues?

Mfg
Thomas

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c++ auf nem avr???
möglich ja,... aber sinnvoll??

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja - wieso sollten die Vorteile von C++ auf dem AVR nicht mehr existent
sein?

Ich rechnete eigentlich erst mit einem erheblichen Overhead für die
Objekte - aber das ist überhaupt nicht so!

Einen Geschwindigkeitsverlust hab ich auch nicht bemerkt ...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wird der Constructor von bla1 beim Erzeugen des
> Objektes bla2 auch noch gleich aufgerufen, weil ja bla1
> auch erzeugt wird?

Ja.

> Und ich nehme an, dass das bereits noch vor PortsInitialisieren()
> (siehe constructor bla2) passiert?

Ja.

> wird gleich der Konstructor der LCD-Klasse aufgerufen
> bevor die Ports im Constructor der Hauptklasse (hier bla2)
> initialisiert werden

Und genau da liegt dein Designfehler. Jedes Modul sollte die ihm
zugeornete Hardware selbst initialisieren. Das ist ja grad der Witz am
Modulen (egal ob C oder C++). Jedes erledigt seinen eigenen Kram.

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Und genau da liegt dein Designfehler. Jedes Modul sollte die ihm
zugeornete Hardware selbst initialisieren. Das ist ja grad der Witz am
Modulen (egal ob C oder C++). Jedes erledigt seinen eigenen Kram."

Jo - da muss ich dir recht geben ... Da hab ich echt nicht aufgepasst
... Ich hatte das irgendwie so drin, am Anfang die ganzen
Portinitialisierungen zu machen.

Das war auch wirklich der Fehler ... mittlerweile gehts schon :)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur für den Fall, dass du auf die Idee kommt, Ports und LCD mittels
globaler Objekte zu initialisieren:
Wenn du eine globale Instanz einer Klasse erstellst, wird der
Konstruktor ja vor main() aufgerufen. Das Entscheidende ist aber, dass
die Reihenfolge der Konstruktoraufrufe weder festgelegt noch
feststellbar ist.
Aus genau diesem Grund sollte man z.B. std::cout nicht in einem
Konstruktor benutzen, der möglicherweise von einem globalen Objekt
aufgerufen wird.

Aber globale Objekte benötigt man in C++ sowieso nur selten, am
häufigsten noch für ein bestimmtes Pattern, wenn es ums automatische
Initialisieren geht (dann sind die Objekte eh in einem namespace).

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis - aber ich hab nur ein einziges Globales Objekt -
das ist das Objekt, das mir alle meine anderen Objekte (Timer, LCD,
RS232, usw) verwaltet ... Ich denke mal, da ist es genauso, dass man
nicht sagen kann in welcher Reihenfolge die Konstruktoren aufgerufen
werden. Davon bin ich aber gottseidank auch nicht abhängig :-)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich denke mal, da ist es genauso, dass man
> nicht sagen kann in welcher Reihenfolge die Konstruktoren
> aufgerufen werden.

Objekte innerhalb von Klassen werden grundsätzlich in der Reihenfolge
konstruiert, in der sie deklariert wurden (bin mir da ziemlich sicher).
Nicht davon abhängig sein, ist natürlich die bessere Variante. :)

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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