2017-08-04 16 views
5

Trong ví dụ sau, tờ khai chuyển tiếp kê khai struct Y foward là không đủ. Nếu bạn nhận xét X :: b, nó biên dịch tốt, vì Y có khai báo cấu trúc đầy đủ để làm việc, nhưng X chỉ có khai báo chuyển tiếp.Làm thế nào để khởi tạo các biến trong các lớp đòi hỏi phải đề cập đến các lớp khác mà cần khai báo tròn?

#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

Sau đây là sửa chữa tôi có thể đưa ra:

#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

Và trong khi nó hoạt động trong ví dụ này, nếu các lớp học là đa hình, điều này sẽ yêu cầu using X::X; hoặc using Y::Y; ở trẻ em trong các lớp đó tương ứng.

Có cách nào để thực hiện việc này trong chính tệp tiêu đề không?

+2

Tại sao bạn sẽ cần ví dụ 'sử dụng X :: X' trong lớp con? Hàm khởi tạo vẫn được * khai báo * bên trong lớp, nó chỉ * định nghĩa * (được triển khai) bên ngoài định nghĩa lớp (nghĩa là nó không phải là nội dòng). –

+0

Có phải không? Hãy để tôi thử nó – kim366

+1

Tất cả những gì bạn cần là [cấu trúc tiêu đề/triển khai đúng] (https://stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies) và thay vì khởi tạo các thành viên trong lớp học làm điều đó trong danh sách khởi tạo constructor. – NathanOliver

Trả lời

0

Bạn có thể làm điều này:

#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

Được rồi, vì vậy hãy đặt định nghĩa trong một hàm công khai trong một tiêu đề riêng biệt. Có vẻ hợp lý. – kim366

Các vấn đề liên quan