如何实现彼此引用的类?

时间:2011-02-04 05:40:05

标签: c++ circular-reference

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

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

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

4 个答案:

答案 0 :(得分:5)

此代码在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;
};

希望这有帮助!

答案 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.因此,通过间接解决方案,如其他人所指出的那样。