类的前向声明会导致类型错误

时间:2014-11-08 05:37:21

标签: c++

为什么它会在案例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;
}

解释我是怎么做的。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

前向声明必须使用指针。以下应编译

class fruit{
    apple* b; // error: incomplete type but why? there is no recursion I guess
};

原因是在创建类水果时,编译器需要知道它将为其成员分配多少内存。如果它是一个指针,这很容易,32位或64位,具体取决于您的架构。这就是前方声明有效的原因。

如果你尝试在那里分配一个完整的对象,那么编译器需要知道苹果将为它预留内存的大小。但由于它只是一个前向声明,因此它不知道该大小并显示错误

答案 1 :(得分:2)

在前向声明之后和定义之前,类fruit确实是一个不完整的类型。

您只能以有限的方式使用它,例如,定义指向此类型的指针或引用,或声明(但不定义)使用不完整类型作为参数或返回类型的函数。但是,在您的代码中,您使用的是fruit类型,而不是指针或引用,因此它是非法的。