[英]Forward declaration of class leads to incomplete type error
为什么在情况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;
}
请向我解释。 任何帮助是极大的赞赏。
前向声明必须使用指针。 以下应编译
class fruit{
apple* b; // error: incomplete type but why? there is no recursion I guess
};
这样做的原因是,在创建类水果时,编译器需要知道它将为其成员分配多少内存。 如果是指针,这很容易,根据您的体系结构,可以是32位或64位。 这就是为什么前向声明起作用的原因。
如果尝试在此处分配完整的对象,则编译器需要知道为它保留内存的大小。 但是因为它只是一个前向声明,所以它不知道该大小并且显示错误
在前向声明之后和定义之前,类fruit
确实是不完整的类型。
您只能以有限的方式使用它,例如,定义此类的指针或引用,或者声明(但不定义)使用不完整类型作为参数或返回类型的函数。 但是,在您的代码中,您使用的是fruit
类型,而不是指针或对其的引用,因此它是非法的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.