如何定义两个依赖类?

时间:2010-10-10 14:03:28

标签: c++ qt gcc

看看下面的简单代码:

class A;
class B
{
    A a;
};

class A
{
    B b;
};

int main(int argc, char *argv[])
{
    return 1;
}

它没有编译,为什么?

来自GCC(Qt)的

错误消息: main.cpp:6:错误:字段'a'的类型不完整

5 个答案:

答案 0 :(得分:2)

好吧,这是不可能的,因为A会包含一个包含A等的B. 如果他们依赖于彼此,他们可以保持对彼此的引用或指针,或者一个人可以握住另一个,而另一个掌握一个指针/参考。

答案 1 :(得分:2)

IIRC,如果你定义某种对象,它必须是一个完整的类型,否则它的大小将不知道,并且struct的布局将包含它不知道。

此外,您编写的内容毫无意义,因为如果您想创建类型为A的对象,它将包含类型为B的对象,该对象将包含{{1}类型的对象1}},等等。因此,类型为A或类型为A的对象会在内存中占用无限空间,这绝对不是好事。

相反,如果这些成员是指针/引用,前向声明就足够了,你甚至不会有这个“小”问题,即需要为结构提供无限的内存。 :)

答案 2 :(得分:2)

为了使编译器能够构建类B,它需要知道其所有成员的大小。前向声明class A;没有说明,只将名称A引入范围。您可以使用指针引用A,这是编译器始终知道的大小。

答案 3 :(得分:1)

您必须至少使其中一个成为指针。否则,您要求每个实例分配另一个类的实例。换句话说,你要求它分配一个无限量的内存:

答案 4 :(得分:-1)

你不能拥有A a。你有前向声明的A,在你定义它之前你不能使用它。