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

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

问题描述:

为什么它会在情况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类型,而不是指向它的指针或引用,因此它是非法的。