我有两个有父子关系的类(Parent
类有一个“Child
类),而Child
类有一个指向{{1}的指针1}}。在构造子节点时初始化父指针会很好,如下所示:
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;
}
,C++ FAQ说我会收到编译器警告(BTW,在VS2010上,我没有收到警告),但我真的更喜欢这个,然后在this
的构造函数中调用一些set函数。我的问题是:
Parent
对象时是否明确定义了父this
指针?谢谢,
波阿斯
编辑:感谢Timbo,它确实是duplicate(呵呵,我甚至选择了相同的类名)。所以让我们获得一些附加值:引用怎么样?是否可以/安全地执行以下操作? :
Child
答案 0 :(得分:46)
是。只要没有用于直接或间接访问未初始化的成员或虚函数,就可以在初始化列表中使用this
指针,因为该对象尚未完全构建。对象child
可以存储this
Parent
指针以供日后使用!
答案 1 :(得分:10)
父“this
指针,在”指针术语“中,是定义良好的(否则父构造函数将如何知道它在哪个实例上运行?),但是:
Child
对象之后声明的字段尚未初始化; 因此,父对象一般仍处于不一致状态;子对象在构造父对象时将做的所有事情都将在一个半构造的对象上完成,这通常不是一件好事(例如,如果它称为“正常”方法 - 依赖于以下事实:对象是完全构造的 - 你可能会进入“不可能”的代码路径。)
但是,如果所有子对象在其构造函数中都使用父指针来存储它以便稍后使用它(=>当它实际构造时),它没有任何问题。
答案 2 :(得分:4)
只要你完全构造Parent
对象之后的,就不会尝试取消引用指针,行为是明确定义的(正如@Sergey在下面的评论中所说的那样) ,如果正在构造的对象实际上是从Parent
派生的,那么其构造函数的所有必须已经完成。)