Использование функций-членов членов в инициализаторе конструктора - PullRequest
2 голосов
/ 05 мая 2010

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

class Foo
{
 public:
  Foo( int i ) : m_i( i ) {}  //works with no problem

  int getInt() {return m_i;}

  ~Foo() {}
 private:
  int m_i;
};

class Bar
{
 public:
  Bar() : 
   m_foo( 5 ),           //this is ok 
   m_myInt( m_foo.getInt() ) //runtime error, seg 11
  {}

  ~Bar() {}
 private:
        Foo m_foo;
  int m_myInt;


};

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

Ответы [ 2 ]

9 голосов
/ 05 мая 2010

Порядок инициализации не зависит от порядка элементов в списке инициализации. Фактический порядок - это порядок членов в определении класса. То есть в вашем примере m_foo будет инициализироваться раньше m_myInt не из-за списка инициализации, а потому, что член появляется первым в классе.

Конкретный пример, который вы опубликовали, должен скомпилироваться и работать без проблем.

3 голосов
/ 05 мая 2010

Элементы данных инициализируются в порядке, указанном в объявлении класса (порядок в private: в вашем примере). Порядок, указанный в списке инициализатора, не имеет запрета на строительный заказ.

Итак, в вашем примере переупорядочение элементов данных, например, может привести к неопределенному поведению:

private:
    int m_myInt;
    Foo m_foo;

Возможно ли, что порядок элементов данных действительно отличается от того, который вы указали?

...