Безопасно ли использовать указатель «this» в списке инициализации?

У меня есть два класса с отношениями родитель-потомок (класс Родитель имеет «имеет» Дочерний класс ) , а класс Child имеет обратный указатель на Parent . Было бы неплохо инициализировать родительский указатель при создании дочернего элемента следующим образом:

class Child;
class Parent;

class Child
{
public:
 Child (Parent* parent_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(this) {};

private:
    Child child;
}

Теперь я знаю, что люди рекомендуют не использовать this в списке инициализации, и C ++ FAQ говорит, что я получу предупреждение компилятора (кстати, на VS2010 я не получаю предупреждения), но мне это действительно нравится больше, чем вызов некоторой функции set в Parent конструктор. Мои вопросы:

  • Правильно ли определен родительский этот указатель при создании объекта Дочерний ?
  • Если да, то почему его использование считается плохой практикой как указано выше?

Спасибо,

Боаз

РЕДАКТИРОВАТЬ: Спасибо, Тимбо, это действительно дубликат (да, я даже выбрал те же имена классов). Итак, давайте добавим ценность: как насчет ссылок? Можно ли / безопасно делать следующее? :

class Child
{
public:
 Child (Parent& parnet_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(*this) {};

private:
    Child child;
}

48
задан BYS2 25 May 2019 в 16:15
поделиться