C++报错variable 'Point a' has initializer but incomplete type如何解决
错误原因
你代码的核心问题是类的声明与定义顺序不符合C++编译规则:
- 开头的
class Point;属于前向声明,仅能向编译器表明Point是一个存在的类,无法提供类的内存布局、成员函数、构造函数等完整信息 - C++编译器是从上到下逐行编译的,编译到
main函数中Point a(5, 6);这一行时,还没有扫描到下方Point类的完整定义,无法确认该如何构造Point类的实例,因此抛出类型不完整的错误。
修复方案
最直接的修复方式是将Point类的完整定义移到main函数之前,替换原有的前向声明即可,修正后的代码如下:
#include <iostream> class Point { private: int x = 0; int y = 0; public: Point(int x, int y) { this->x = x; this->y = y; } Point(){} //setters void setX(int x) { this->x = x; } void setY(int y) { this->y = y; } //getters int getX() { return this->x; } int getY() { return this->y; } void getAll() { std::cout << "x = " << this->x << std::endl; std::cout << "y = " << this->y << std::endl; } ~Point(){} }; int main() { Point a(5, 6); a.getAll(); return 0; }
如果是大型项目需要做声明和实现分离的场景,也可以将类声明放在头文件中,类实现放在单独的cpp文件,main所在的cpp引入对应头文件即可,也能避免该错误。
内容的提问来源于stack exchange,提问作者Emilia
相关产品推荐
相关产品推荐

