Безопасно ли следующее? - PullRequest
1 голос
/ 31 декабря 2011

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

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 ]

4 голосов
/ 31 декабря 2011

Это безопасно, если вы не используете a в конструкторе B, так как объект a еще не создан.

Я имею в виду, вы не должны разыменовывать указатель a в B's конструкторе; однако после выполнения конструктора base вы можете безопасно разыменовать B::a в других методах B.

4 голосов
/ 31 декабря 2011

a не был создан, но у него есть адрес, и на данном этапе законно взять его адрес. Тем не менее, вы должны быть уверены, что не используете указатель в конструкторе B (т.е. не разыменовывайте указатель).

Хотя все это довольно неловко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...