我需要在游戏中使用二维数组;
首先,我在名为“ HelloWorldScene.h”的头文件中这样声明:
using namespace cocos2d;
class HelloWorld : public Layer
{
private:
...
int upgradeCosts[4][4];
...
}
然后,我尝试在名为“ HelloWorldScene.cpp”的源文件中对其进行定义:
#include "HelloWorldScene.h"
...
bool HelloWorld::init()
{
....
upgradeCosts[4][4] = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};
...
}
但是它给了我这个错误:“标量初始化程序中的多余元素”
括号{{150, ...... , 1900 }}
之间的整个代码都用红色下划线。而且我不知道该怎么办,请帮助我。
答案 0 :(得分:5)
像这样初始化整个数组绝对是错误的:
upgradeCosts[4][4] = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};
因为您只设置了[4][4]
元素,而不是整个数组。 Excess elements in scalar initializer
错误是指此错误。 int
是标量,只能用1个值初始化,而您尝试用16个值初始化。
要纠正此问题,您将假定可以执行以下操作:
bool HelloWorld::init()
{
upgradeCosts = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};
}
但是,由于upgradeCosts
在构建HelloWorld
时已被默认初始化,因此无法再次进行初始化。
对此的幼稚解决方案如下:
bool HelloWorld::init()
{
int data[4][4] = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
upgradeCosts[i][j] = data[i][j];
...
}
但是,这涉及无意义的复制。更好的解决方案是将数组初始化完全移出init
方法。您可以通过仅初始化头文件中的数组来完成此操作:
// hpp file
class HelloWorld
{
private:
int upgradeCosts[4][4] = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};
public:
bool init();
};
或者您可以在HelloWorld
的构造函数中对其进行初始化:
// hpp file
class HelloWorld
{
private:
int upgradeCosts[4][4];
public:
HelloWorld();
bool init();
};
// cpp file
HelloWorld::HelloWorld()
: upgradeCosts{{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}}
{ }
或者,如果您知道upgradeCosts
的所有实例上的HelloWorld
应该相同,则可以使用static
成员并将其初始化,如下所示:
// hpp file
class HelloWorld
{
private:
const static int upgradeCosts[4][4];
public:
bool init();
};
// cpp file
const int HelloWorld::upgradeCosts[4][4] = {{150, 250, 900, 1800},
{100, 200, 600, 1200},
{200, 350, 1200, 2000},
{150, 300, 1000, 1900}};