2017-08-04 50 views
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; 
} 

Ideone

以下是修复我能想出:

#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; 
} 

Ideone

虽然它在这个例子中,如果类呈多形性,这分别需要using X::X;using Y::Y;

有没有办法在头文件本身做到这一点?

+2

为什么你会需要例如在孩子课中使用X :: X'?构造函数在类中仍然是*声明的,它只是在类定义之外的* defined *(实现的)(即它不是内联的)。 –

+0

是吗?让我试试吧 – kim366

+1

所有你需要的是[正确的头文件/实现结构](https://stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies)而不是初始化类体中的成员在构造函数初始化列表中执行。 – NathanOliver

回答

0

你可以这样做:

#include <functional> 

template <typename T> bool (*get_lambda())(T&) {return [] (auto& y_) { return y_.a; };}; 

struct Y; 

struct X 
{ 
    std::function<bool(Y&)> b{get_lambda<Y>()}; 

    bool a{false}; 
}; 

struct Y 
{ 
    std::function<bool(X&)> b{get_lambda<X>()}; 

    bool a{true}; 
}; 

int main() 
{ 
    return 0; 
} 
+0

好吧,所以把定义放在一个公共函数中的单独头文件中。看起来很合理。 – kim366

相关问题