繁体   English   中英

类的前向声明导致不完整的类型错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM