类的前向声明导致不完整的类型错误
问题描述:
为什么它会在情况1中产生错误,但在情况2中不会产生错误?做完forward declareion编译器会以其他方式对待它吗?我认为它只是编译器的一个声明,用于搜索整个文件的类apple
。类的前向声明导致不完整的类型错误
// CASE 1
class apple; // forward declaration
class fruit{
apple b; // error: incomplete type but why? there is no recursion I guess
};
class apple{
public: int a;
};
int main(){
fruit f;
return 0;
}
// CASE 2
class apple{
public: int a;
};
class fruit{
apple b; // no error works fine
};
int main(){
fruit f;
return 0;
}
请解释一下。任何帮助是极大的赞赏。
答
转发声明必须使用指针。以下应编译
class fruit{
apple* b; // error: incomplete type but why? there is no recursion I guess
};
其原因是,创建一个类水果时,编译器需要知道需要多少内存分配为它的成员。如果它是一个指针,这很容易,32位或64位取决于你的架构。这就是为什么前向声明有效。
如果你试图在那里分配一个完整的对象,那么编译器需要知道多大的苹果将为它保留内存。但由于它只是一个前向声明,所以它不知道这个尺寸并显示错误
答
在前向声明之后和定义之前,类fruit
确实是一个不完整的类型。
您只能以有限的方式使用它,例如定义指向这些类型的指针或引用,或声明(但不定义)使用不完整类型作为参数或返回类型的函数。但是,在您的代码中,您正在使用fruit
类型,而不是指向它的指针或引用,因此它是非法的。