例如,我有一个课程:
class Foo {
public:
Foo(const Foo& foo) : father(foo) {}
private:
const Foo& father;
};
如果对象是顶部,如何分配father
字段?
我尝试过Foo foo(foo);
,但编译器警告我foo未初始化,我猜编译器仅在完成所有初始化后才将内存分配给foo对象,因此如果我这样做,father
将引用到一些野生内存地址。
那么,在这种情况下,如果对象是顶部,该如何分配father
权限呢?
答案 0 :(得分:2)
使用特殊的构造函数(并使用标签将您的构造函数与copy constructor区别开):
struct father_tag {};
class Foo {
public:
Foo(const Foo& foo, father_tag) : father(foo) {}
Foo() : father(*this) {}
private:
const Foo& father;
};
// usage:
Foo father;
Foo next(father, father_tag{});
,或者您可以使用指针代替引用,将其留在链末尾的nullptr
处。然后,您可以使用if (father)
来检查是否结束:
class Foo {
public:
Foo(Foo const* pfather) : m_pfather(pfather) {}
Foo() : m_pfather(nullptr) {}
private:
Foo const* m_pfather;
};