2012-06-26 3 views
0

Я хотел бы использовать списки инициализаторов для инициализации объектов, чтобы упростить управление объектами, но проблема в том, что объекты ссылаются друг на друга.Списки инициализаторов с внутренними ссылками

//B::B(A &a) //The only available constructor for B 

class AB 
{ 
    A m_a; 
    B m_b; 

    AB() 
     : m_a() 
     , m_b(m_a) 

    ... 
}; 

Это разрешено стандартом? Из того, что я понимаю, это должно быть, учитывая, что объявление участника в классе - это A, тогда B, порядок в списке инициализации не имеет значения, поскольку они будут инициализированы их физическим порядком в классе.

+0

Будьте осторожны с вашим конструктором копирования и оператором присваивания копии. –

+0

IIRC, они не сгенерированы, если объект содержит указатели или ссылки? – Coder

+3

@Coder: Это неверно. –

ответ

2

Это разрешено стандартом? Из того, что я понимаю, это должно быть, учитывая, что объявление участника в классе - это A, тогда B, порядок в списке инициализации не имеет значения, поскольку они будут инициализированы их физическим порядком в классе.

Да, порядок инициализации - это атрибут объявления атрибутов члена в классе. Кроме того, в зависимости от того, что делает конструктор B, он корректен (хотя и близко к краю), чтобы передать ссылку на еще неинициализированный объект до тех пор, пока ссылка (или указатель) пока сохраняется ссылка или указатель, но объект не используется.

Смежные вопросы