C ++中的循环类型依赖性死锁

时间:2013-12-30 03:24:03

标签: c++ c++11

FooBar成为类型。 FooBar bar个成员,BarFoo foo个成员:

struct Foo;
struct Bar;

struct Foo { Bar bar; };
struct Bar { Foo foo; };

这无法编译,因为必须为Foo定义Bar才能定义,但在定义Foo之前无法定义Bar - 死锁。

这个问题有解决方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用以下方案(即,使用指针而不是具体对象):

struct Foo;
struct Bar;

struct Foo 
  {
  Bar *bar; 
  };
struct Bar 
  {
  Foo *foo; 
  };

在您的代码中适当地分配/取消分配barfoo

原因:虽然你转发声明你的结构,但是编译器没有任何线索如何在Bar结构中分配Foo具体对象,因为它没有看到Bar'尚未提及。

答案 1 :(得分:3)

万能的标准:

§9.2/ 9

  

非静态(9.4)数据成员不得有不完整的类型。在   特别是,C类不应包含类的非静态成员   C,但它可以包含指向C类对象的指针或引用。

§9.2/ 19

  

如果标准布局类对象具有任何非静态数据成员,则为   address与其第一个非静态数据的地址相同   会员。否则,其地址与其第一个地址相同   基类子对象(如果有的话)。