例如,我有两个班级
class Foo;
class Bar;
class Foo {
const Bar &m_bar;
...
};
class Bar {
const Foo &m_foo;
...
};
让foo
为Foo
的对象,bar
为Bar
的对象。有没有办法(正常或“黑客”)来创建/初始化foo
和bar
,其成员m_bar
和m_foo
会相互引用(我的意思是{{ 1}}是foo.m_bar
而bar
是'foo')?
允许将任何成员添加到bar.m_foo
和Foo
,为其添加父级,制作模板等等。
答案 0 :(得分: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 ) {}
};
如果它们是局部变量(没有约束力),我认为没有 一个办法。
实际上,局部变量有一个简单的解决方案:只是 定义一个将它们作为成员的本地类,并使用它。
答案 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);
...
}