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
    Aborted

    Visual 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.


Anmelden zum Antworten