Erzeugen mehrere Objekte im Konstruktor & Reihenfolge



  • Eine Frage zum Erzeugen von Objekten im Konstruktor:

    Angenommen, ich habe folgende Klasse:

    class SomeClass
    {
        ObjectType1 d_o1;
        ObjectType2 d_o2;
    
     public:
        SomeClass(ObjectType1 o);
    };
    

    Hinter ObjectType[12] verbergen sich irgendwelche anderen Klassen. Der Konstruktor von d_o2 braucht eine Referenz auf d_o1. Ist der folgende Code fuer den Konstruktor von SomeClass legal?

    SomeClass::SomeClass() :
        d_o1(), d_o2(d_o1)
    {
        // ...
    }
    

    Nochmal in Worten: ich muss erst d_o1 initialisieren, dann davon eine Referenz an d_o2 uebergeben. Gibt es im Standard eine Garantie, dass der Konstruktor von d_o1 fertig ist, bevor jener von d_o2 aufgerufen wird? Oder schiebe ich das besser in die Konstruktordefinition?

    Ich habe es einfach mal ausprobiert, und es scheint zu gehen. Allerdings weiss ich nicht, ob das jetzt einfach Zufall ist und gerade mit meinem gcc funktioniert--allerdings weiss ich auch nicht genau, wonach ich suchen muss. Ich hoffe, jemand hat einen Tipp fuer mich.

    Schonmal danke,
    Martin



  • Die Membervariablen deiner Klasse werden in der Reihenfolge initialisiert, wie sie innerhalb der Klassendefinition deklariert sind (die Initialisierungslistenreihenfolge ist irrelevant). Also ist dein Beispiel okay.

    Übrigens darfst du eine Referenz mit einem nicht konstruierten Objekt initialiseren, sofern du keine (implizite) Dereferenzierung vornimmst, also nicht auf referenzierte Objekt zugreifst. Analog zu Zeigern.



  • Nexus schrieb:

    Die Membervariablen deiner Klasse werden in der Reihenfolge initialisiert, wie sie innerhalb der Klassendefinition deklariert sind (die Initialisierungslistenreihenfolge ist irrelevant). Also ist dein Beispiel okay.

    Hi Nexus,

    danke fuer die Antwort--das war genau die Info, die mir gefehlt hat. Jetzt verstehe ich auch, warum der gcc meckert, wenn die Ini-listenreihenfolge ungleich der in der Klassendefinition ist 🙂



  • Matzko schrieb:

    Jetzt verstehe ich auch, warum der gcc meckert, wenn die Ini-listenreihenfolge ungleich der in der Klassendefinition ist 🙂

    Gibt das da eine Warning? (Hab kein GCC installiert; nimmt mich nur Wunder, weil das eine sehr sinnvolle Warnung ist. Ein Fehler, der darauf basiert ist sehr schwer zu finden)
    Kannst du die mal kurz zeigen?



  • Ich bin zwar nicht der OP, aber bin gerade unter Ubuntu:

    class One
    {
    private:
    	int x;
    
    public:
    	One(int a) : x(a) { }
    };
    
    class Two
    {
    private:
    	One& o;
    
    public:
    	Two(One& a) : o(a) { }
    };
    
    class Test
    {
    private:
    	Two t;
    	One o;
    
    public:
    	Test() : o(1), t(o) { }
    };
    
    int main()
    {
    }
    

    test.cpp: In constructor ‘Test::Test()’:
    test.cpp:23: warning: ‘Test::o’ will be initialized after
    test.cpp:22: warning: ‘Two Test::t’
    test.cpp:26: warning: when initialized here

    Erscheint aber nur mit dem Flag -Wall



  • Danke. Die Meldung ist wirklich sehr nett.

    Visual Studio 9 bringt da keine Warning. Selbst mit /W4 nicht.. (höchste Warning Stufe)


Anmelden zum Antworten