如何分配参考链的末端?

时间:2019-04-09 10:01:09

标签: c++

例如,我有一个课程:

class Foo {
 public:
  Foo(const Foo& foo) : father(foo) {}
 private:
  const Foo& father;
};

如果对象是顶部,如何分配father字段? 我尝试过Foo foo(foo);,但编译器警告我foo未初始化,我猜编译器仅在完成所有初始化后才将内存分配给foo对象,因此如果我这样做,father将引用到一些野生内存地址。

那么,在这种情况下,如果对象是顶部,该如何分配father权限呢?

1 个答案:

答案 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;
};