![](/img/trans.png)
[英]In C++ how to best decouple 2 classes that must maintain collections of references to each other
[英]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
),必须为a
, a.objB.objA
, a.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.