C++俄罗斯方块Piece Constructor类:如何返回指定方块数组
解决俄罗斯方块Piece Constructor返回指定方块数组的问题
首先,咱们先拆解下你代码里的两个核心问题:
- 返回类型不匹配:你的
colocarFicha函数声明返回int,但你试图返回的是一个5×5的二维数组,这在C++里直接编译失败。 - 局部数组生命周期问题:你定义的
Pieces是函数内的局部变量,函数执行结束后这块内存会被系统回收,直接返回它的地址会导致悬空指针,后续访问会出现未定义行为。
下面给你两种可行的解决方案,从偏C风格到现代C++风格都有:
方案一:静态数组 + 数组指针返回(偏C风格)
这种写法适合习惯C语言语法的场景,通过static延长数组生命周期,同时修改函数返回类型匹配二维数组:
#include "PieceCreator.h" #include <ctime> // 别忘了引入time头文件,不然srand会报错 // 修改返回类型为「指向包含5个int元素的数组的指针」 int (*PCreator::colocarFicha())[5] { // 加static让数组存储在静态内存区,函数结束后不会被销毁 static int Pieces[6][5][5] = { { {0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} }, { {0,0,0,0,0}, {1,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} }, { {0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} }, { {0,0,0,0,0}, {0,1,1,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0} }, { {0,0,0,0,0}, {0,1,1,0,0}, {1,1,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0} }, { {0,0,0,0,0}, {1,1,0,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0} } }; srand((int)time(0)); int randNum = rand() % 6; // 你定义了6个方块,要取0-5的索引,所以是%6不是%5 return Pieces[randNum]; // 返回随机选中的方块数组,指定索引的话直接写Pieces[2]即可 }
关键说明:
static关键字让Pieces的生命周期贯穿整个程序,避免函数结束后内存被回收。- 返回类型
int (*)[5]是C语言里用来表示二维数组指针的写法,完美匹配你要返回的5×5数组类型。
方案二:使用std::array(现代C++推荐)
如果你的项目基于C++11及以上版本,更推荐用std::array来管理数组,它支持值语义,直接返回即可,完全不用操心指针和生命周期的问题:
#include "PieceCreator.h" #include <ctime> #include <array> // 引入std::array的头文件 // 返回类型直接写成二维std::array std::array<std::array<int,5>,5> PCreator::colocarFicha() { static std::array<std::array<std::array<int,5>,5>,6> Pieces = {{ {{0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}}, {{0,0,0,0,0}, {1,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}}, {{0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}}, {{0,0,0,0,0}, {0,1,1,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}, {{0,0,0,0,0}, {0,1,1,0,0}, {1,1,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}, {{0,0,0,0,0}, {1,1,0,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0}} }}; srand((int)time(0)); int randNum = rand() % 6; return Pieces[randNum]; // 要返回指定索引的话,换成Pieces[2]就行 }
关键说明:
std::array是C++标准库提供的容器,和原生数组一样高效,但支持拷贝、赋值等操作,返回时会自动完成数组拷贝(因为Pieces是static,拷贝开销极小)。- 类型声明更直观,不容易出现指针相关的错误,代码可读性更高。
内容的提问来源于stack exchange,提问作者Davey - X
相关产品推荐
相关产品推荐

