为什么它会在案例1中产生错误而在案例2中不会产生错误?完成前向声明编译器以其他方式处理它?我认为这只是编译器搜索整个文件类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;
}
解释我是怎么做的。非常感谢任何帮助。
答案 0 :(得分:2)
前向声明必须使用指针。以下应编译
class fruit{
apple* b; // error: incomplete type but why? there is no recursion I guess
};
原因是在创建类水果时,编译器需要知道它将为其成员分配多少内存。如果它是一个指针,这很容易,32位或64位,具体取决于您的架构。这就是前方声明有效的原因。
如果你尝试在那里分配一个完整的对象,那么编译器需要知道苹果将为它预留内存的大小。但由于它只是一个前向声明,因此它不知道该大小并显示错误
答案 1 :(得分:2)
在前向声明之后和定义之前,类fruit
确实是一个不完整的类型。
您只能以有限的方式使用它,例如,定义指向此类型的指针或引用,或声明(但不定义)使用不完整类型作为参数或返回类型的函数。但是,在您的代码中,您使用的是fruit
类型,而不是指针或引用,因此它是非法的。