如何构造一个常量引用循环的class?

How to construct a class with a constant reference cycle?

我正在写一个玩具程序,我不小心创建了一个我不知道如何构造的class。

struct Parent;

struct Data {
  const Parent &parent;
  // ...
  Data(const Parent &parent) : parent(parent) {}
};

struct Parent {
  const std::vector<Data> datas;
  // ...
  Parent(std::vector<Data> &&data) : datas(std::move(data)) {}
};

父项有一个常量数据列表。每个数据都有一个对父级的常量引用。缺一不可。

我不能使用这个构造函数

Parent(std::vector<Data> &&data)

因为我无法在不引用已经存在的父项的情况下构建 Data。但是我不能构造 Parent 没有 Data 的向量来初始化 datas.....

如何构造 Parent 以便每个 Data 对象都包含一个返回所属 Parent 对象的 const 引用?

您可以利用 C++ 允许自引用声明在同一语句中创建 ParentData 实例这一事实:

Parent parent(std::vector{Data{parent}, Data{parent}});

我不确定这种设计在实践中有何用处,但正如您所说,这只是一个玩具程序。

基于 ,我能够使用一个构建器函数,它接受一个 const Parent & 并构建一个 Data.

的任意向量

然后可以从 Parent 的成员初始化列表中使用 this 调用构建器。

struct Parent;
struct Data {
  const Parent &parent;
  // ...
  Data(const Parent &p) : parent(p) {}
};

std::vector<Data> builder(const Parent &p) {
    std::vector<Data> datas;
    datas.emplace_back(p);
    return datas;
}

struct Parent {


  const std::vector<Data> datas;

  Parent() : datas(builder(*this)) {}
};

godbolt 上查看。