如何初始化const循环引用成员

时间:2013-09-13 11:15:56

标签: c++ initialization circular-dependency circular-reference member-initialization

例如,我有两个班级

class Foo;
class Bar;

class Foo {
  const Bar &m_bar;
  ...
};

class Bar {
  const Foo &m_foo;
  ...
};

fooFoo的对象,barBar的对象。有没有办法(正常或“黑客”)来创建/初始化foobar,其成员m_barm_foo会相互引用(我的意思是{{ 1}}是foo.m_barbar是'foo')?

允许将任何成员添加到bar.m_fooFoo,为其添加父级,制作模板等等。

2 个答案:

答案 0 :(得分:6)

foobar的关联是什么?如果他们有外在的 联系,你可以这样写:

extern Foo foo;
extern Bar bar;

Foo foo( bar );
Bar bar( foo );

(我在这里假设它是构造者设置的 引用参数。)

当然,这假定了命名空间范围和静态生命周期 (但匿名命名空间很好)。

如果他们是班级成员,也没有问题:

class Together
{
    Foo foo;
    Bar bar;
public:
    Together() : foo( bar ), bar( foo ) {}
};

如果它们是局部变量(没有约束力),我认为没有 一个办法。

编辑:

实际上,局部变量有一个简单的解决方案:只是 定义一个将它们作为成员的本地类,并使用它。

答案 1 :(得分:0)

如果我正确理解您的问题,这是行不通的,因为创建对象栏需要Foo,反之亦然。 您不能使用引用而是使用指针。你可以在哪里创建两个对象separatley,然后将Bar设置为Foo,将Foo设置为Bar。

class Foo
{ 
public:
   Foo();
   void setBar( const Bar* bar ){ _bar = bar; }

private:
   const Bar* _bar;
}
// class Bar analog to Foo


void xxx:something(void)
{
   Foo* f = new Foo;
   Bar* b = nee Bar;
   f->setBar(b);
   b->setBar(f);
   ...
}