我正在编写一个玩具程序,我不小心创建了一个我不知道如何构造的类。
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++ 允许自引用声明的事实在同一语句中创建
Parent
和 Data
实例:
Parent parent(std::vector{Data{parent}, Data{parent}});
基于 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 上查看。