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
相关产品推荐
相关产品推荐

