c++ - 如何实现相互引用的类?

标签 c++ circular-reference

我是 C++ 编程的新手,所以您可能会觉得我的问题太愚蠢了。很抱歉,但我想知道如何实现这种 Java 风格的结构:

#include "B";
class A {
   B objB;
}
---
#include "A";
class B {
   A objA;
}

编译器疯狂地试图理解这段代码。你能告诉我一个可能的解决方案吗?谢谢!

最佳答案

此代码在 C++ 中是非法的,编译器拒绝它是正确的。问题是,如果在 B 类型的对象内部有一个 A 类型的具体对象,反之亦然,那么这两个对象的大小都没有有意义的定义。特别是,C++ 中的每个对象的大小必须至少为一个字节。因此,给定一个类型 A 的对象(称之为 a),a 必须有一个字节的存储空间,a.objB.objA , a.objB.objA.objB.objA 等。实际上,您需要无限的存储空间,因为在这些对象的内部总是嵌套了一个对象!

要解决此问题,您需要更改它,以便将 指针 分别存储到 A 和 B 中的 B 和 A 类型的对象。这打断了链条,因为虽然 A* 指针 指向 A 对象,但指针本身不是 A 对象,因此只使用四个字节。一旦你有了这个,你就可以使用前向声明来声明这些指针。例如:

文件:A.h:

class B;
class A {
     B* objB;
};

文件:B.h:

class A;
class B {
     A* objA;
};

希望这对您有所帮助!

关于c++ - 如何实现相互引用的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894933/

相关文章:

c++ - 为什么只能在头文件中实现模板?

c++ 在签名中使用 const 的含义

c++ - 声明没有指针的默认参数循环引用?

delphi - 解决 Delphi 中的循环引用

Java - 在 MVC 模式应用程序中检测循环引用的方法

titanium - Appcelerator 和 CommonJS 模块(缓存和循环引用)

c++ - 如何从 CWinThread 访问 AfxGetMainWnd()?

c++ - 为 VS 2010 (MSVC 10) 编译的 libcurl 二进制文件

c++ - Char* 与 std::string

c# - 什么是循环引用销毁序列