2015-11-03 4 views
1

У меня ошибка с ошибкой памяти, и я не знаю, откуда она взялась. Мой вопрос: мне позволено получить адрес члена класса, находясь внутри списка инициализации конструктора, чтобы передать его объекту, которому нужна ссылка на него?C++ Получить адрес члена класса в списке инициализации конструктора

Например:

class A 
{ 
}; 

class ReferencesA 
{ 
    A * const pA; 

    ReferencesA(A * ptrA) : pA(ptrA) { } 
}; 

class B 
{ 
    A a; 

    ReferencesA referencesA; 

    B() : referencesA(& a) { } 
}; 

Является ли это безопасно & a внутри списка инициализации конструктора? Мне кажется, что это будет так, но все не всегда работает так, как мы ожидаем.

спасибо.

+0

Выглядит нормально. Это может быть то, что «referenceA» делает с ptrA внутри своего ctor, что вызывает крушение, особенно если «a» еще не построено. – rakeshdn

ответ

2

Порядок инициализации базовых элементов в class B составляет a, затем referencesA. Это потому, что они появляются в этом порядке в декларации класса. (Порядок, в котором они появляются, если вообще, в списке инициализации в конструкторе не имеет значения.)

Таким образом, используя &a инициализацию referencesAявляется безопасным, если немного хрупкими. В вашем случае &a является адресом созданного по умолчанию элемента a.

Я бы посоветовал не кодировать это, если кто-то изменит порядок членов вашего класса.

+1

Спасибо. Проблема в том, что если я хочу иметь указатели констант (или ссылки), чтобы указать, что указатель будет таким же и действителен для всего жизненного цикла объекта, тогда мне нужно инициализировать вещи в списке инициализаторов, иначе я смогу ' t использовать const. – Virus721

+4

Стоит отметить, что сохранение указателя на неинициализированный объект безопасно, поэтому порядок в классе не имеет значения. 'a' должен быть первым в списке классов, если вы хотите _read или write_ через указатель. –