代码之家  ›  专栏  ›  技术社区  ›  Svyat

如何创建一个类设置,其中两个类各包含另一个类的实例?

  •  1
  • Svyat  · 技术社区  · 5 月前

    我有一个这样的类设置,其中每个类都包含另一个类的一个成员:

    class b;
    
    class a
    {
        b var;
    };
    
    class b
    {
        a var;
    };
    

    我该如何让它工作?

    2 回复  |  直到 5 月前
        1
  •  0
  •   Mureinik    5 月前

    正如所写的那样,这种设置是不可能的—— a 包含以下实例 b ,它又包含一个实例 ,然后包含一个实例 b ,无限。

    相反,你需要这些类来保持彼此的指针:

    class a {
       b* b;
    };
    
    class b {
       a* a;
    };
    
        2
  •  0
  •   wohlstad    5 月前

    至少有一个你的 var s应该是一个[智能]指针,以避免无限包含( a 持有 b 哪一个成立 哪一个成立 b 等等)。
    这使得可以使用 forward declaration 打破包容循环。

    一个是否足够的决定取决于你的实体的性质。

    相关案例:

    1. 如果两个实体都是 分离 并且应该只相互引用,两者都应该使用指针:

      class Entity1; // forward declaration
      
      class Entity2 {
          Entity1 * pEntity1;
      }
      
      class Entity2; // forward declaration (required if Entity1 is defined in a separate module)
      
      class Entity1 {
          Entity2 * pEntity2;
      };
      
    2. 如果一个实体可以被视为 起源 另一个(the 小孩 ),父母 可以 (但不是必需的)“按值”持有子项,只有子项应该使用指针:

      class Parent; // forward declaration
      
      class Child {
          Parent * pParent;
      };
      
      class Parent {
          Child child;
      };
      

    请注意,使用2个指针始终是一个有效的选项,即使在父/子的情况下也是如此。

    附注:
    上面的指针可能会被智能指针替换。
    但这需要解决另一个关于生命周期和所有权的问题,我倾向于将其排除在这个答案之外,以将其限制在问题的范围内。