Konstruktor von einer static Klasse wird nicht aufgerufen



  • Folgendes Szenario:

    class NochEinContainer
    {
        public: 
            NochEinContainer() 
            {
                cout<<this<<endl;
                exit(0);            
            }
    };
    
    class Container
    {
        public: 
            Container()
            {            
    
            }
            static NochEinContainer cont;
    };
    

    Der Konstruktor von NochEinContainer wird nie aufgerufen, warum? Ist das static-Attribut cont von Container jetzt gültig?

    Wie kann ich den Konstruktor aufrufen lassen, ohne das ich einen Pointer daraus mache und ein Objekt per new anlege?



  • Du mußt auch irgendwo dieses Objekt anlegen, damit du es wiederfindest (brauchst du sowieso, wenn du etwas damit machen willst). Dazu packst du am besten in die Quelldatei von "Container" die Zeile:

    NochEinContainer Container::cont/*(...)*/;
    

    (wenn du willst, kannst du an dieser Stelle zusätzliche Ctor-Parameter angeben)



  • CStoll schrieb:

    Du mußt auch irgendwo dieses Objekt anlegen, damit du es wiederfindest (brauchst du sowieso, wenn du etwas damit machen willst). Dazu packst du am besten in die Quelldatei von "Container" die Zeile:

    NochEinContainer Container::cont/*(...)*/;
    

    (wenn du willst, kannst du an dieser Stelle zusätzliche Ctor-Parameter angeben)

    Der g++ hat dies aber nicht bemängelt, ist das "normal"?
    Nur wenn ich einen static pointer habe gibt's halt die Fehlermeldung, dass ich ihn mit ein Objekt initialisieren muss



  • Frage: Wäre das Verhalten des obigen Codes nicht ohnehin undefiniert? Der Konstruktor von NochEinContainer wird vor der Ausführung von main aufgerufen. Gibt es irgendeine Garantie, daß das darin verwendete cout Objekt zu diesem Zeitpunkt bereits konstruiert worden ist?



  • Delryn schrieb:

    Der g++ hat dies aber nicht bemängelt, ist das "normal"?

    Den Compiler interessiert das sowieso nicht. Und der Linker wirft nur dann eine Fehlermeldung, wenn er ein Symbol nicht auflösen kann. Da dein static Member aber nirgendwo verwendet wird, hat der Linker gar keinen Grund irgendetwas aufzulösen.

    Delryn schrieb:

    Nur wenn ich einen static pointer habe gibt's halt die Fehlermeldung, dass ich ihn mit ein Objekt initialisieren muss

    Dann poste mal den konkreten Code. Ob der static Member ein Zeiger oder kein Zeiger ist, spielt hier keine Rolle. Das Verhalten ist das Gleiche.

    edit:

    Z2 schrieb:

    Frage: Wäre das Verhalten des obigen Codes nicht ohnehin undefiniert? Der Konstruktor von NochEinContainer wird vor der Ausführung von main aufgerufen. Gibt es irgendeine Garantie, daß das darin verwendete cout Objekt zu diesem Zeitpunkt bereits konstruiert worden ist?

    Das Verhalten ist durchaus definiert. Das im Detail zu erklären, würde aber jetzt zu weit führen. Vllt. findest du mehr Informationen unter dem Stichwort "nifty initialization". Vom Prinzip her funktioniert das wie folgt:

    class iostream
    {
    public:
        static ostream& cout_instance()
        {
            static ostream cout;
            return cout;
        }
    };
    
    ostream& cout = iostream::cout_instance();
    

    Egal wann du cout zum ersten mal benutzt, es ist damit sichergestellt, dass das cout Objekt vorher auf jeden Fall erzeugt wird. Das ganze lässt sich natürlich auch dynamisch handeln.


Anmelden zum Antworten