C++继承报错Expected class name before '{' token 解决方案咨询
错误修复方案
1. 修复头文件循环引用
从编译器报错In file included from point.h:4, from main.cpp:2: rectangle.h可以判断,你本地实际运行的point.h文件中意外添加了#include "rectangle.h代码,和rectangle.h引用point.h的逻辑形成了循环引用,导致头文件展开时Point类还未完成定义就被Rectangle类引用,因此报错找不到Point类型。
修复方法:删除point.h中所有引用rectangle.h的代码,Point类不需要依赖Rectangle类。
2. 修复构造函数参数声明错误
你在rectangle.h中写的Rectangle(Point(), int h, int w);是非法语法:参数声明只需要写类型和参数名,不需要加括号,加括号会被编译器识别为调用Point默认构造函数的表达式,而非参数类型声明。
修复方法:
// rectangle.h 构造函数声明修改为 Rectangle(const Point& tl, int h, int w); // rectangle.cpp 构造函数实现修改为 Rectangle::Rectangle(const Point& tl, int h, int w) : tL(tl), height(h), width(w) {}
3. 修复继承逻辑误用
Rectangle和Point是**包含(has-a)关系(矩形包含左上角点),不是是一个(is-a)**关系,不需要继承Point。当前的继承写法不仅没有实际作用,还会导致后续调用getX()、getY()时拿到的是继承来的冗余成员变量,而非你存在tL成员里的左上角坐标,出现逻辑错误。
修复方法:将Rectangle类定义行的继承声明删除:
// 修改前 class Rectangle: public Point { // 修改后 class Rectangle {
后续逻辑优化建议
删除继承后,你代码中直接调用rect.getX()、rect.getY()的地方会报错,需要改成通过getTL()拿到Point成员再调用对应方法,例如:
// 原来的写法 int x = rect1.getX(); // 修改后的写法 int x = rect1.getTL().getX();
另外你当前的makeRectangle成员函数返回了新构造的矩形对象,调用时需要赋值才会生效:
// 原来的写法不会修改rect_1的值 rect_1.makeRectangle(rect_1); // 修改为 rect_1 = rect_1.makeRectangle(rect_1);
内容的提问来源于stack exchange,提问作者Purpleskittles

