我如何实现在C ++中进行循环的互锁对象结构
class Foo
{
Bar bar;
};
class Bar
{
Foo foo;
};
答案 0 :(得分:5)
#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
};
#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.h
和Bar.cpp
使用相同的设置。
注意:上面的代码假定使用了支持C ++ 11的编译器。但是,如果不是这种情况,则应使用原始指针(例如Bar* bar
),并且必须实现destructor
以调用delete bar
。这是避免资源泄漏的必要条件;当然,上面假设Foo
和Bar
拥有其成员指针是这些类的正确行为,但它很容易被改变,这不是正确的假设。
答案 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可能更受支持。