繁体   English   中英

如何实现相互引用的类?

[英]How to implement classes with references to each other?

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

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

编译器疯狂地试图理解此代码。 您能给我建议一个可能的解决方案吗? 谢谢!

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

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

档案:Ah:

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

档案:Bh:

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

希望这可以帮助!

您需要转发声明

class B;

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

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

你可以做什么:

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

#include "A"
class B {
    A objA
}

看到这种情况的另一种方法是考虑一个单独的源文件,其中包括“ first”或AH或BH。 [引述“第一个”也可能引起混淆。]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM