6

例如,我有两个班级

class Foo;
class Bar;

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

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

Letfoo是 的对象Foo并且bar是 的对象Bar。有什么方法(正常或“黑客”)来创建/初始化foo,并且bar他们的成员会相互引用(我的意思是是和是'foo')?m_barm_foofoo.m_barbarbar.m_foo

允许将任何成员添加到Fooand Bar,为它们添加父级,使它们成为模板等等。

4

2 回答 2

6

foo和的联系是bar什么?如果它们有外部链接,您可以编写如下内容:

extern Foo foo;
extern Bar bar;

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

(我在这里假设是构造函数设置了对参数的引用。)

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

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

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

如果它们是局部变量(无绑定),我认为没有解决方案。

编辑:

实际上,局部变量有一个简单的解决方案:只需定义一个以它们为成员的局部类,然后使用它。

于 2013-09-13T11:27:10.763 回答
0

如果我正确理解您的问题,这将无法工作,因为要创建对象栏,您需要 Foo ,反之亦然。您不能使用引用,而是使用指针。您可以在其中单独创建两个对象,然后将 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);
   ...
}
于 2013-09-13T12:18:49.777 回答