C++类和相互连接的对象形成一个循环

C++ class and interlinked objects forming a cycle

本文关键字:循环 一个 对象 连接 C++      更新时间:2023-10-16

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

class Foo
{
    Bar bar;
};
class Bar
{
    Foo foo;
};

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拥有它们的成员指针是这些类的正确行为,但它很容易被改变——这不是正确的假设。

通常的方法是使用正向声明。要做到这一点,你应该将这些拆分为单独的头文件,例如

//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的指针和指向bar的指针。这是因为编译器知道为指针分配多少内存,但不知道所需的对象有多大

另请参阅这个答案,它使用智能指针实现了同样的效果。我的解决方案是一个更简单、纯粹的C++版本,但James Adikin的解决方案可能更受支持。