Безопасно ли следующее?

Рассмотрим этот код:

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 (т.е. не разыменовывайте указатель).

Это все довольно неловко, хотя.

Другие вопросы по тегам