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;
}
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;
}
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?
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). –
Có phải không? Hãy để tôi thử nó – kim366
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