Это проблема, с которой я часто сталкиваюсь. Следующие примеры иллюстрируют это:
struct A {
int m_SomeNumber;
};
struct B {
B( A & RequiredObject );
private:
A & m_RequiredObject;
};
struct C {
C( );
private:
A m_ObjectA;
B m_ObjectB;
};
Реализация конструктора C
выглядит примерно так:
C::C( )
: B( m_ObjectA )
{ }
Поскольку порядок инициализации не определен, m_ObjectA
может быть неинициализирован при вызове конструктора m_ObjectB
, что приведет к неопределенному поведению. Один из способов навязать определенный порядок инициализации состоит в том, чтобы сделать указатели членов и инициализировать их в теле конструктора, что приведет к правильному порядку, но это ужасно по нескольким причинам. Есть ли способ форсировать определенный порядок инициализации, используя список инициализации конструктора? Если нет, то есть ли у вас другие предложения, как с этим справиться.