C ++类和相互关联的对象形成一个循环

时间:2015-02-24 13:51:40

标签: c++

我如何实现在C ++中进行循环的互锁对象结构

class Foo
{
    Bar bar;
};

class Bar
{
    Foo foo;
};

2 个答案:

答案 0 :(得分:5)

foo.h中

#include <memory>

class Bar; // Forward declare Bar class

class Foo
{
public:
    Foo();

private:
    std::unique_ptr<Bar> bar; // Use pointer so that header include is not necessary
};

Foo.cpp中

#include "Foo.h"
#include "Bar.h" // Now include bar (in the cpp file to avoid circular includes)

Foo::Foo() :
    bar(new Bar())
{
    // Do nothing
}

Bar.hBar.cpp使用相同的设置。

编辑1

注意:上面的代码假定使用了支持C ++ 11的编译器。但是,如果不是这种情况,则应使用原始指针(例如Bar* bar),并且必须实现destructor以调用delete bar。这是避免资源泄漏的必要条件;当然,上面假设FooBar拥有其成员指针是这些类的正确行为,但它很容易被改变,这不是正确的假设。

答案 1 :(得分:0)

通常的方法是使用前向声明。要做到这一点,你应该将它们分成单独的头文件,例如

//foo.h
class Bar;

class Foo
{
     Bar* myBar; //Note this must be a pointer
     int someVal;
     int someFunc();

}


//bar.h
class Foo;
class Bar
{
     Foo* myFoo; //Again, must be a pointer
}

头文件不应互相包含。有一些限制,因为在编译器遇到实际声明之前,你只能使用指向foo和指针指针。这是因为编译器知道为指针分配了多少内存,但是不知道所需对象有多大。

另请参阅使用智能指针实现相同功能的this answer。我的解决方案是一个更简单,纯粹的C ++版本,但James Adikin可能更受支持。