Frage

Dies ist ein Problem, auf das ich oft stoße.Die folgenden Beispiele verdeutlichen es:

struct A {
    int m_SomeNumber;
};

struct B {
    B( A & RequiredObject );
private:
    A & m_RequiredObject;
};

struct C {
    C( );
private:
    A m_ObjectA;
    B m_ObjectB;
};

Die Implementierung des Konstruktors von C sieht ungefähr so ​​aus:

C::C( )
 : B( m_ObjectA )
{ }

Da die Reihenfolge der Initialisierung nicht definiert ist, m_ObjectA könnte nicht initialisiert sein, wenn der Konstruktor von m_ObjectB aufgerufen wird, was zu undefiniertem Verhalten führt.Eine Möglichkeit, eine bestimmte Reihenfolge der Initialisierung zu erzwingen, besteht darin, die Mitglieder zu Zeigern zu machen und sie im Konstruktorkörper zu initialisieren und so die richtige Reihenfolge zu erzwingen. Dies ist jedoch aus mehreren Gründen hässlich.Gibt es eine Möglichkeit, mithilfe der Initialisierungsliste des Konstruktors eine bestimmte Initialisierungsreihenfolge zu erzwingen?Wenn nicht, haben Sie weitere Vorschläge, wie Sie damit umgehen können?

War es hilfreich?

Lösung

Da die Reihenfolge der Initialisierung nicht definiert ist

Im Gegenteil, es ist klar definiert.Die Reihenfolge der Initialisierung entspricht der Reihenfolge, in der die Mitgliedsvariablen in Ihrer Klasse deklariert werden (und das unabhängig von der tatsächlichen Reihenfolge der Initialisierungsliste!Es ist daher eine gute Idee, die Reihenfolge der Initialisierungsliste mit der Reihenfolge der Deklarationen übereinstimmen zu lassen, um böse Überraschungen zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top