statische klassenmember die nicht elementaren datentyp hat
-
hi,
haette folgende frage hoffe ihr koennt helfen:
header file:
class B { public: B(short val=5):m_val(val){} SetVal(short val){m_val=val;} private: short m_val; }; class A { public: A(); private: static B s_bObj; }cpp-file:
B A::s_bObj; A::() { s_bObj.SetVal(3); }Meine Frage:
Wann genau wird das statische Objekt s_bObj instanziiert!?!?
Ich haette gedacht dass das noch vor der laufzeit passiert .. geht doch aber nicht da konstruktor da ueberhaupt nicht aufgerufen haette werden koennen
Etwas Background-Tips hierzu waere schoen. Forum hat leider keine topics gehabt, die dieses beinhalteten (jedenfalls nicht die die ich gefunden habe)
danke.
-
Vor Ausführung des eigentlichen Programms (also vor Aufruf der main-Funktion).
-
pepe75 schrieb:
Ich haette gedacht dass das noch vor der laufzeit passiert ..
Vor der Laufzeit wird nichts angelegt, auch statische Elemente werden erst zur Laufzeit, aber vor dem ersten Zugriff initialisiert.
-
hmmm.
heisst das, dass die erste zeile in der cpp-dateiB A::s_bObj;schon bereits den default konstruktor aufruft?
man erzaehlt mir naemlich gerade, dass man nicht immer davon ausgehen kann, dass s_bObj bereits durch den Default-Konstruktor gelaufen ist (siehe zeile oben) beim zugriff auf s_bObj im Konstruktor von A !?!?

-
"man erzaehlt mir naemlich gerade"
Dann erzählt jemand was falsches.
-
Es kommt allerdings darauf an, wo und wie das A-Objekt erzeugt wird.
-
also genauer geht es eigentlich um einen
boost::mutex (aus der boost C++ lib)d.h. das obige s_bObj ist bei mir eigentlich ein boost::mutex (wieder statisch).
wenn ich nun im Konstruktor von A auf den mutex zugreifen moechte, woher weiss ich dass dieser schon ordentlich konstruiert wurde !?!?
(wobei die A-Instanz irgendwo in ner normalen z.B. C-Klassenmethode erzeugt wird)
vielen dank.
-
Die Reihenfolge der Initialisierung ist meines Wissens nicht definiert? Oder?
Das heißt, wenn ich aus ctor von A eine statische Instanz von B verwende kann das schief gehen, weil B evtl. vorher nicht initialisiert wurde.
Richtig?
Weiß nur das ich schon viel Probleme mit statischen Objekten hatte.
-
Problematisch ist sowas eigentlich nur, wenn man statische Objekte in zwei unterschiedlichen Übersetzungseinheiten hat, und das statische Objekt in einer Übersetzungseinheit von dem statischen Objekt der anderen Übersetzungseinheit abhängt. Dann kann es passieren, dass ersteres initialisert wird, bevor zweiteres initialisert wird, und dann knallt es.
Gegen sowas kann man das "Construct On First Use"-Idiom benutzen, das in etwa so aussieht:someObjekt& getInstance() { static someObjekt instance; return instance; }Der Zugriff erfolgt dann logischweise über
getInstance()und es wird so sichergestellt, dass statische Objekt bei seiner ersten Benutzung auf jeden Fall initialisiert wird.