Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in zwei unterschiedlichen .cpp Dateien initialisier. Die main() befindet sich in einer dritten .cpp Datei. Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?
Entwickler schrieb: > Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in > zwei unterschiedlichen .cpp Dateien initialisier. Das haut dir der Linker um die Ohren. Also nein, deine Situation MUSS eine andere sein.
Header a.hpp
1 | class A{ |
2 | static int x; |
3 | };
|
Header b.hpp
1 | class B{ |
2 | static int y; |
3 | };
|
Source a.cpp
1 | int A::x = 0; |
Source b.cpp
1 | int B::y = 0; |
Entwickler schrieb: > Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in > zwei unterschiedlichen .cpp Dateien initialisier. Wozu so ein krummes Konstrukt überhaupt andenken? Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles Innenleben haben kann, aber von außen für alle derartigen Objekte gleich aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der Datei, die diese Objektklasse definiert. Fertig. W.S.
Entwickler schrieb: > Header a.hpp > class A{ > static int x; > }; > > Header b.hpp > class B{ > static int y; > }; > > Source a.cpp > int A::x = 0; > > Source b.cpp > int B::y = 0; Iirc ist das undefiniert, müsste von linker abhängen
Entwickler schrieb: > Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert? https://stackoverflow.com/questions/1005685/c-static-initialization-order Am besten also wrappen.
Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt. Globale Variablen werden intialisiert, bevor dein Programm überhaupt startet; daher hat die Reihenfolge keinen Effekt.
Entwickler schrieb: > Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert? Das kommt darauf an in welcher Reihenfolge der Linker den Code bindet. U.a spielt die Reihenfolge der Argumente des Linkers eine Rolle. Das Problem umgeht man in dem man eine statische Memberfunktion definiert, die man eine Referenz auf ein in der Funktion definierte statische Instanz zurückliefern lässt.
Entwickler schrieb: > Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert? Das ist undefiniert. Besorg dir ein ordentliches C++ Buch. Da wird erklärt, wie man mit so einer Situation umgeht. W.S. schrieb: > Entwickler schrieb: >> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in >> zwei unterschiedlichen .cpp Dateien initialisier. > > Wozu so ein krummes Konstrukt überhaupt andenken? > > Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles > Innenleben haben kann, aber von außen für alle derartigen Objekte gleich > aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem > Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so > ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der > Datei, die diese Objektklasse definiert. Fertig. > > W.S. Was genau willst du damit sagen?
N00B schrieb: > Iirc ist das undefiniert, müsste von linker abhängen Nein! Die statischen Klasseneigenschaften sind völlig unabhängig voneinander und klar definiert. Es gibt also kein konkurrierendes Verhalten.
N00B schrieb: > Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt. > Globale Variablen werden intialisiert, bevor dein Programm überhaupt > startet; daher hat die Reihenfolge keinen Effekt. Es gibt Konstruktionen wo Funktionen bereits vor main aufgerufen werden.
Nachtrag: Damit ist die Reihenfolge auch völlig egal. Irrelevant.
Mikro 7. schrieb: > N00B schrieb: > >> Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt. >> Globale Variablen werden intialisiert, bevor dein Programm überhaupt >> startet; daher hat die Reihenfolge keinen Effekt. > > Es gibt Konstruktionen wo Funktionen bereits vor main aufgerufen werden. Ich habe mich etwas unklar ausgedrückt: Variablen (im Sinne von int, char, …) werden iirc im Startup initialisiert, da ist die Reihenfolge egal (technisch gibt es eine). Konstruktoren von Objekten werden vor Main() mit einer Reihenfolge abhängig davon, was der linker so treibt, aufgerufen.
EAF schrieb: > N00B schrieb: > >> Iirc ist das undefiniert, müsste von linker abhängen > > Nein! > Die statischen Klasseneigenschaften sind völlig unabhängig voneinander > und klar definiert. > Es gibt also kein konkurrierendes Verhalten. ? Nur weil es nichts gibt, was im dem Beispiel von der Reihenfolge abhängen könnte, heißt es nicht, dass es keine Reihenfolge gibt; ein Speicherbereich wird halt zuerst beschrieben (auf den Plattformen, die ich kenne).
Entwickler schrieb: > Header a.hpp > class A{ > static int x; > }; > > Header b.hpp > class B{ > static int y; > }; > > Source a.cpp > int A::x = 0; > > Source b.cpp > int B::y = 0; Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage, wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die Frage ad absurdum)
N00B schrieb: > Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage, > wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die > Frage ad absurdum) A::x ist ein Objekt mit Typ int.
N00B schrieb: > ...
1 | /*global*/ int i = f() ; |
Wenn nun f() auf eine globale Variable aus einer anderen Translation Unit zugreift, dann kann es durchaus sein, dass diese dort noch nicht initialisiert wurde.
N00B schrieb: > Entwickler schrieb: > >> Header a.hpp >> class A{ >> static int x; >> }; >> Header b.hpp >> class B{ >> static int y; >> }; >> Source a.cpp >> int A::x = 0; >> Source b.cpp >> int B::y = 0; > > Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage, > wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die > Frage ad absurdum) Ups, ints sind doch Objekte... Aber Objekte ohne Konstruktoren führen die Frage so oder so ad absurdum
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.