5
在以下示例中,前向声明struct Y
前向声明是不够的。如果你注释掉X :: b,它编译得很好,因为Y
有一个完整的结构声明可供使用,但X
只有前向声明。如何在需要提及需要循环声明的其他类的类中初始化变量?
#include <functional>
#include <iostream>
struct Y;
struct X
{
std::function<bool(Y&)> b{[] (auto& y_) { return y_.a; }};
bool a{false};
};
struct Y
{
std::function<bool(X&)> b{[] (auto& x_) { return x_.a; }};
bool a{true};
};
int main()
{
return 0;
}
以下是修复我能想出:
#include <functional>
#include <iostream>
struct Y;
struct X
{
X();
std::function<bool(Y&)> b;
bool a{false};
};
struct Y
{
Y();
std::function<bool(X&)> b{[] (auto& x_) { return x_.a; }};
bool a{true};
};
X::X() : b([] (auto& y_) { return y_.a; }) {}
Y::Y() : b([] (auto& x_) { return x_.a; }) {}
int main()
{
return 0;
}
虽然它在这个例子中,如果类呈多形性,这分别需要using X::X;
或using Y::Y;
。
有没有办法在头文件本身做到这一点?
为什么你会需要例如在孩子课中使用X :: X'?构造函数在类中仍然是*声明的,它只是在类定义之外的* defined *(实现的)(即它不是内联的)。 –
是吗?让我试试吧 – kim366
所有你需要的是[正确的头文件/实现结构](https://stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies)而不是初始化类体中的成员在构造函数初始化列表中执行。 – NathanOliver