让Foo
和Bar
成为类型。 Foo
有Bar bar
个成员,Bar
有Foo foo
个成员:
struct Foo;
struct Bar;
struct Foo { Bar bar; };
struct Bar { Foo foo; };
这无法编译,因为必须为Foo
定义Bar
才能定义,但在定义Foo
之前无法定义Bar
- 死锁。
这个问题有解决方法吗?
答案 0 :(得分:3)
您可以使用以下方案(即,使用指针而不是具体对象):
struct Foo;
struct Bar;
struct Foo
{
Bar *bar;
};
struct Bar
{
Foo *foo;
};
在您的代码中适当地分配/取消分配bar
和foo
。
原因:虽然你转发声明你的结构,但是编译器没有任何线索如何在Bar
结构中分配Foo
具体对象,因为它没有看到Bar
'尚未提及。
答案 1 :(得分:3)
万能的标准:
§9.2/ 9
非静态(9.4)数据成员不得有不完整的类型。在 特别是,C类不应包含类的非静态成员 C,但它可以包含指向C类对象的指针或引用。
和
§9.2/ 19
如果标准布局类对象具有任何非静态数据成员,则为 address与其第一个非静态数据的地址相同 会员。否则,其地址与其第一个地址相同 基类子对象(如果有的话)。