我是C ++编程的新手,所以也许你会发现我的问题太愚蠢了。对此感到抱歉,但我想知道如何实现这种Java风格的结构:
#include "B";
class A {
B objB;
}
---
#include "A";
class B {
A objA;
}
编译器疯狂试图理解这段代码。你能告诉我一个可能的解决方案吗?谢谢!
答案 0 :(得分:5)
此代码在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;
};
希望这有帮助!
答案 1 :(得分:2)
您需要转发声明
class B;
在定义A类之前,然后像以前一样继续。这适用于引用,但不适用于这样的对象,因为你实际上没有一个对象隐式包含它自己。
答案 2 :(得分:1)
您无法在对象B
内实例化对象A
,该对象本身位于对象B
内。递归地,你将永远无法构造对象,因为它具有无限递归。
你能做什么:
#include "B"
class A {
B *objB;
}
#include "A"
class B {
A objA
}
答案 3 :(得分:0)
另一种看待这种情况的方法是考虑单个源文件,其中包括A.H或B.H“first”。考虑到那里可能存在的混淆,引用[“第一”。]
class A {
B objB;
}
class B {
A objA;
}
这怎么有意义?在我们知道B之前我们不可能定义A,在我们知道A之前我们不能定义B.因此,通过间接解决方案,如其他人所指出的那样。