You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:47:26