Mitglieder mit Mitgliedern initialisieren
-
19-09-2019 - |
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?
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.