У меня есть два класса с отношением родитель-потомок (класс Parent
"has-a" Child
класс), а класс 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
.Мои вопросы:
- Четко ли определен родительский указатель
this
при создании объекта Child
? - Если так, почему это считается плохой практикой использованияэто как указано выше?
Спасибо,
Боаз
РЕДАКТИРОВАТЬ: Спасибо Тимбо, это действительно дубликат (да, я даже выбрал те же имена классов).Итак, давайте добавим некоторую ценность: как насчет ссылок?Возможно ли / безопасно ли сделать следующее?:
class Child
{
public:
Child (Parent& parnet_ptr_) : parent_ptr(parent_ptr_) {};
private:
Parent* parent_ptr;
};
class Parent
{
public:
Parent() : child(*this) {};
private:
Child child;
}