如何构造一个常量引用循环的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++ 允许自引用声明在同一语句中创建 Parent
和 Data
实例这一事实:
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 上查看。
我正在写一个玩具程序,我不小心创建了一个我不知道如何构造的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++ 允许自引用声明在同一语句中创建 Parent
和 Data
实例这一事实:
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 上查看。