Инициализация членов с членами - PullRequest
4 голосов
/ 11 февраля 2010

Это проблема, с которой я часто сталкиваюсь. Следующие примеры иллюстрируют это:

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, что приведет к неопределенному поведению. Один из способов навязать определенный порядок инициализации состоит в том, чтобы сделать указатели членов и инициализировать их в теле конструктора, что приведет к правильному порядку, но это ужасно по нескольким причинам. Есть ли способ форсировать определенный порядок инициализации, используя список инициализации конструктора? Если нет, то есть ли у вас другие предложения, как с этим справиться.

1 Ответ

12 голосов
/ 11 февраля 2010

Поскольку порядок инициализации не определен

Напротив, он четко определен.Порядок инициализации равен порядку, в котором переменные-члены объявляются в вашем классе (и это независимо от фактического порядка в списке инициализации! Поэтому хорошая идея, чтобы порядок списка инициализации соответствовал порядку объявлений визбежать неприятных сюрпризов).

...