我需要在游戏中使用二维数组,所以;
首先,我在名为"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 }}
之间的整个代码都用红色下划线。我不知道该怎么办,请帮帮我。
这样初始化整个数组是绝对错误的:
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}};