Безопасно ли следующее?
Рассмотрим этот код:
struct A {};
struct B
{
B(A* a) : a(a) {}
private:
A* a;
};
struct base
{
base(B b) : b(b) {}
protected:
A a;
private:
B b;
};
struct derived : public base
{
derived() : base(B(&a)) // <-- IS THIS OK?
{}
};
Здесь базовому классу нужен объект B, переданный его конструктору производным классом, а объект B ссылается на объект A, но объект A живет внутри базового класса.
Конструктор объекта B ничего не делает с указателем A, кроме как сохраняет его, так что я думаю, что все должно быть в порядке, но все равно это не так, потому что технически объект A еще не существует во время передачи это к базовому конструктору.
Могу ли я получить неприятности при этом или все должно быть в порядке?
2 ответа
Это безопасно, пока вы не используете a
в B
конструктор, как объект a
еще не построен
Я имею в виду, вы не должны разыменовывать указатель a
в B's
конструктор; однако после base
конструктор выполнен, можете смело разыскивать B::a
в других методах B
,
a
не был создан, но у него есть адрес, и на данном этапе законно взять его адрес. Вы должны быть уверены, однако, не использовать указатель в конструкторе B
(т.е. не разыменовывайте указатель).
Это все довольно неловко, хотя.