【问题标题】:How to implement classes with references to each other?如何实现相互引用的类?
【发布时间】:2011-02-04 05:40:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ circular-reference


    【解决方案1】:

    此代码在 C++ 中是非法的,编译器拒绝它是正确的。问题是,如果您在 B 类型的对象内部有一个 A 类型的具体对象,反之亦然,那么任何一个对象的大小都没有有意义的定义。特别是,C++ 中的每个对象的大小都必须至少为一个字节。因此,给定一个类型 A 的对象(称为 a),aa.objB.objAa.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;
    };
    

    希望这会有所帮助!

    【讨论】:

    • 非常感谢您的解释。这对理解很有帮助。
    • @Kid24- 很高兴为您提供帮助!如果您认为它回答了您的问题,请不要忘记接受答案。 :-)
    【解决方案2】:

    你需要前向声明

    class B;
    

    在定义 A 类之前,然后像以前一样继续。这适用于引用,但不适用于像这样的对象,因为您不能真正让对象隐式包含自身。

    【讨论】:

      【解决方案3】:

      您不能在对象A 内实例化对象B,而该对象本身位于对象B 内。递归你将永远无法构造对象,因为它具有无限递归。

      你可以做什么:

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

      【讨论】:

      • 如果标题被包含保护正确包围,那实际上是行不通的。
      • @GMan:当然。并且可能在每个包含的文件中都有一个前向类声明。
      【解决方案4】:

      另一种查看方式是考虑单个源文件,其中包含 A.H 或 B.H “first”。 [考虑到那里可能的混乱,引用了“first”。]

      class A {
         B objB;
      }
      class B {
         A objA;
      }
      

      这怎么可能?我们不可能在我们知道 B 之前定义 A,我们也不能在我们知道 A 之前定义 B。因此,其他人指出的间接解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多