1

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

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

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

4

4 回答 4

5

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

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

档案:啊:

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

文件:Bh:

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

希望这可以帮助!

于 2011-02-04T05:46:18.047 回答
2

您需要前向声明

class B;

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

于 2011-02-04T05:47:09.567 回答
1

您不能在本身位于objectB内部的object 内部实例化对象。递归地,您将永远无法构造对象,因为它具有无限递归。AB

你可以做什么:

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

#include "A"
class B {
    A objA
}
于 2011-02-04T05:44:37.877 回答
0

另一种看待这一点的方法是考虑一个单一的源文件,首先包含 AH 或 BH。[考虑到那里可能的混乱,引用了“第一个”。]

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

这怎么可能有意义?在我们知道 B 之前,我们不可能定义 A,在我们知道 A 之前我们也不能定义 B。因此,正如其他人所指出的那样,通过间接的解决方案。

于 2011-02-04T05:52:46.763 回答