最近在用C++做一个象棋小游戏,为了规避全局变量的使用,想使用结构体来声明需要使用的数据。给其中用来存储棋盘信息的二维数组赋值时却遇到了问题:
在结构体内是不能进行数据初始化的,而在函数中(假设我定义了一个结构体d),也不能使用d.map[2][3] = { {,,,},{,,,}};这样的方法给结构体内的数组赋值,因为编译器会报这样的错误:错误error C2440: “=”: 无法从“initializer-list”转换为“int” 。
翻译过来就是:无法将初始化列表转化为整型。
这是因为 map[2][3] = { {,,,},{,,,}};这样的方法,仅能用来初始化数组,而不能用来对数组进行赋值。而声明结构体的目的是抽象出数据类型,在声明结构体时进行初始化也是不合理的,所以数组元素的值得使用其他的方法进行赋值。在 C++ 中,结构体和类是基本相同的,所以我们可以通过给结构体添加构造函数来进行数组的赋值,但终究也是通过循环对数组元素赋值实现的。
数组初始化列表仅能用于声明数组时的初始化,不能用于数组的赋值。
改进前:
所以就得另想办法给这个数组赋值了。可以用循环来完成:先在函数中定义并初始化另一个和你需要使用的数组同行同列的数组,之后使用循环将新定义的数组的值依次赋值给结构体内的数组。
用这种方法可以较方便的给结构体内的数组赋值,而不是使用d.map[0][0] = …;这种方法一个一个的赋值(我差点就这样做了)。下面是我使用到的函数代码:
void Mouse::InitMap() {
struct Data d;
int mapdata[10][9] =
{
{
'C', 'H', 'E', 'M', 'B', 'M', 'E', 'H', 'C' },
{
0, 0, 0, 0, 0, 0, 0, 0, 0 },
{
0, 'G', 0, 0, 0, 0, 0, 'G', 0 },
{
'P', 0, 'P', 0, 'P', 0, 'P', 0, 'P' },
{
0