C++类和相互连接的对象形成一个循环
C++ class and interlinked objects forming a cycle
如何实现在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.h
和Bar.cpp
使用相同的设置。
编辑1
注意:以上代码假设使用了支持C++11的编译器。然而,如果不是这种情况,则应该使用原始指针(例如Bar* bar
),并且必须实现destructor
才能调用delete bar
。这对于避免资源泄漏是必要的;当然,上面假设Foo
和Bar
拥有它们的成员指针是这些类的正确行为,但它很容易被改变——这不是正确的假设。
通常的方法是使用正向声明。要做到这一点,你应该将这些拆分为单独的头文件,例如
//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的解决方案可能更受支持。
相关文章:
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- C++-字符串是否包含一个带有简单循环的单词
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 使用一个循环与两个循环
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 使用一个 for 循环如何迭代和测试迭代器值?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 如何循环 n 次,在 xml 文件中每个循环一个级别
- 初始化时 num 的哪个值会给这个嵌套循环一个"true"输出?
- 两次相同的 for 循环:一个编译,另一个不编译
- 如何在C 中循环一个语句
- 循环一个级数
- 如何在c++中循环一个函数
- 循环一个精灵以显示不止一次
- C++循环一个菜单,直到选择了所有选项
- QT:如何每秒循环一个方法?C++
- 循环一个mpl::map