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

C++开发俄罗斯方块:类对象作函数参数传入后修改无效问题

核心代码问题

你现在代码不生效的首要原因是函数参数使用了值传递:
send函数的形参写的是Board board,C++调用该函数时会拷贝一份传入的Board对象生成栈上临时副本,函数内所有setBoard操作全是在修改这个临时副本。函数执行结束后临时副本直接销毁,main函数里的原始Board对象没有任何改动,哪怕你简化成只调用board.setBoard(3,3,true)也不会对原对象生效。
另外main函数里还有一处逻辑错误:你在while循环外已经定义了Board board;,循环内部又重新定义了同名局部Board对象,循环内所有操作都针对这个每次循环新建的空棋盘,就算修复了传参问题,也会出现每次循环棋盘被重置、状态无法留存的问题。

修复方案
  • 将send函数的形参改为引用传递,直接操作原始对象,避免生成副本:
// 形参加&标记为引用类型
void BlockInfo::send(Board& board)
{
    for (int i = y; i < y + 4; i++)
    {
        for (int j = x; j < x + 4; j++)
        {
            if (block[blockType][rotation][j][i])
            {
                board.setBoard(j, i, true);
            }
        }
    }
}
  • 删除while循环内部重复定义的Board变量,只保留循环外的棋盘实例,避免每次循环重置棋盘状态:
Board board;
while (true)
{
    // 删除此处重复的 Board board; 定义
    BlockInfo blcInf;
    blcInf.send(board);
    board.draw();
}
修复后仍不生效的排查方向
  • 排查Board::setBoard实现:确认函数内部确实修改了对象内存储棋盘状态的成员变量,没有出现内部值拷贝、修改局部临时变量、坐标合法性判断误拦截合法写入的问题。
  • 排查Board::draw实现:确认绘制逻辑读取的是对象自身存储的棋盘状态数组,没有硬编码空数据、读写坐标体系不匹配(比如x/y轴顺序写反、索引起始偏移差1)的问题。
  • 排查坐标边界:确认send函数里循环生成的j、i坐标没有超出Board内部存储数组的下标范围,避免数组越界导致写入数据没有落到正确的内存位置。
  • 排查方块数组访问逻辑:确认block[blockType][rotation][j][i]的维度顺序和定义一致,x/y索引没有写反,不会出现所有判断都取到false、根本没触发setBoard调用的问题。

内容的提问来源于stack exchange,提问作者wsh248

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 13:15:40