如何构造一个引用循环不变的类?

问题描述 投票:0回答:2

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

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 有一个常量数据列表。每个数据都有一个对父级的常量引用。两者缺一不可。

我无法使用这个构造函数

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

因为如果不引用已经存在的父级,我无法构造

Data
。但如果没有
Parent
向量来初始化
Data
,我无法构造
datas
....

如何构造 Parent 以便每个

Data
对象都包含一个指向所属
Parent
对象的 const 引用?

c++ constructor reference c++17 move
2个回答
1
投票

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

Parent
Data
实例:

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

0
投票

基于 Brian 的回答,我能够使用一个构建器函数,该函数接受

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 上查看。

© www.soinside.com 2019 - 2024. All rights reserved.