看看下面的简单代码:
class A;
class B
{
A a;
};
class A
{
B b;
};
int main(int argc, char *argv[])
{
return 1;
}
它没有编译,为什么?
来自GCC(Qt)的错误消息: main.cpp:6:错误:字段'a'的类型不完整
答案 0 :(得分:2)
答案 1 :(得分:2)
IIRC,如果你定义某种对象,它必须是一个完整的类型,否则它的大小将不知道,并且struct
的布局将包含它不知道。
此外,您编写的内容毫无意义,因为如果您想创建类型为A
的对象,它将包含类型为B
的对象,该对象将包含{{1}类型的对象1}},等等。因此,类型为A
或类型为A
的对象会在内存中占用无限空间,这绝对不是好事。
相反,如果这些成员是指针/引用,前向声明就足够了,你甚至不会有这个“小”问题,即需要为结构提供无限的内存。 :)
答案 2 :(得分:2)
为了使编译器能够构建类B
,它需要知道其所有成员的大小。前向声明class A;
没有说明,只将名称A
引入范围。您可以使用指针或引用到A
,这是编译器始终知道的大小。
答案 3 :(得分:1)
您必须至少使其中一个成为指针。否则,您要求每个实例分配另一个类的实例。换句话说,你要求它分配一个无限量的内存:
答案 4 :(得分:-1)
你不能拥有A a。你有前向声明的A,在你定义它之前你不能使用它。