g++ recursive_init
-
Hi,
folgender Quellcode:// Foo.h class Foo { public: Foo(); }; // ######################### // Foo.cpp #include "Bar.h" #include "Foo.h" Foo::Foo() { Bar::Instance(); } // ######################### // Bar.h class Bar: public Foo { private: Bar() { } public: static Bar& Instance() { static Bar bar; return bar; } }; // ####################### // Main.cpp Foo foo;aufgeteilt in die entsprechenden Dateien (wie angegeben).
Kompiliere ich das ganze mit dem g++ und fuehre es aus erscheint:terminate called after throwing an instance of '__gnu_cxx::recursive_init'
what(): N9__gnu_cxx14recursive_initE
AbortedVisual Studio 2005 EE schluckt das ganze ohne Murren.
Mal von dem schlechten Design abgesehen,
ist das legaler C++ Code (im Sinne von definiertes Verhalten)?Also Problem ist der Zugriff auf Bar::Instance im Konstruktor von Foo. Dadurch wird ein statisches Bar-Objekt erstellt, welches wiederrum ein Foo ist (public Vererbung). Dadurch, dass es ein Foo ist wird erneut Bar::Instance aufgerufen, obwohl das einzige Bar-Objekt (da Singleton) noch nicht vollkommen erstellt ist.
Gruß,
DeSoVoDaMu
-
Naja es ist nicht nur schlechtes Design ... lass mal im Konstruktor von foo etwas ausgeben, dann erkennst du vllt. warum

-
Verpass Foo doch einfach zusätzlich einen privaten/protected Konstruktor den du dann vom Bar Konstruktor aus aufrufst.
Dann ist da nixmehr rekursiv.