Visual C++俄罗斯方块项目:受保护成员访问及函数定义报错求助
嘿,我来帮你拆解这些错误,都是C++里常见的语法和类型匹配问题,咱们一个个来解决:
1. 第31、32行「表达式必须是可修改值」错误
你类里的x和y是int数组(int x[4];),但构造函数的参数是单个int&类型的变量。C++里数组名是指针常量,不能直接用单个值给整个数组赋值(比如this->x = x;这种写法完全非法,因为数组不能被当作可修改的左值直接赋值)。
解决思路:明确你的构造函数要怎么初始化数组。如果是想传入一组坐标值初始化数组,就把构造函数参数改成数组类型,然后逐个赋值元素:
// 修改构造函数参数为数组 Tetris::Tetris(const int xArr[4], const int yArr[4], int ID, int piece, int rotation) { // 循环给数组每个元素赋值 for(int i = 0; i < 4; i++){ this->x[i] = xArr[i]; this->y[i] = yArr[i]; } this->ID = ID; this->piece = piece; this->rotation = rotation; }
2. 第38行「缺少显式类型(假定为int),添加int后要求标识符」错误
这是成员函数定义的语法顺序搞反了。C++中类成员函数的正确定义格式是:返回类型 类名::函数名(参数列表),你写成了Tetris::int getX(),把类名和返回类型的顺序弄混了。正确写法应该是:
int Tetris::getX() { // 这里还要解决下面的返回值问题 }
3. 第40行「返回值类型与函数类型不匹配」错误
你的getX()声明返回int,但类里的x是int[4]数组,直接return x;相当于返回数组的首地址(指针类型),和声明的int类型完全不匹配。
解决思路:明确getX()的用途——是返回数组的某个元素?还是返回整个数组?
- 如果是返回单个元素,给函数加索引参数,指定返回哪个位置的值:
int Tetris::getX(int index) const { // 加个索引合法性检查,避免越界 if(index >= 0 && index < 4){ return x[index]; } return -1; // 非法索引可以返回错误值,或者根据需求抛出异常 } - 如果要返回整个数组,更安全的方式是改用
std::array<int,4>(C++11及以上支持),或者返回数组的指针/引用,但前者类型更清晰,也更易维护。
修正后的完整代码示例
这里给出一个适配数组逻辑的完整修正版本,同时给只读的get方法加上const修饰,符合C++的最佳实践:
class Tetris { protected: int x[4]; int y[4]; int ID; int piece; int rotation; public: // 构造函数改为接受数组参数 Tetris(const int xArr[4], const int yArr[4], int ID, int piece, int rotation); // 调整getX/getY为带索引的版本 int getX(int index) const; void setX(int index, int value); int getY(int index) const; void setY(int index, int value); // 其他get/set方法保持逻辑 int getID() const; void setID(int ID); int getPiece() const; void setPiece(int piece); int getRotation() const; void setRotation(int rotation); }; // 构造函数实现 Tetris::Tetris(const int xArr[4], const int yArr[4], int ID, int piece, int rotation) { for(int i = 0; i < 4; i++){ x[i] = xArr[i]; y[i] = yArr[i]; } this->ID = ID; this->piece = piece; this->rotation = rotation; } // getX实现:只读方法加const int Tetris::getX(int index) const { if(index >= 0 && index < 4){ return x[index]; } return -1; } // setX实现:设置指定索引的元素值 void Tetris::setX(int index, int value) { if(index >= 0 && index < 4){ x[index] = value; } } // 其他get/set方法实现 int Tetris::getID() const { return ID; } void Tetris::setID(int ID) { this->ID = ID; } int Tetris::getPiece() const { return piece; } void Tetris::setPiece(int piece) { this->piece = piece; } int Tetris::getRotation() const { return rotation; } void Tetris::setRotation(int rotation) { this->rotation = rotation; }
内容的提问来源于stack exchange,提问作者The American Fox
相关产品推荐
相关产品推荐

