2d数组中的“标量初始化程序中的多余元素”错误

时间:2018-07-17 14:38:50

标签: c++ arrays multidimensional-array

我需要在游戏中使用二维数组;

首先,我在名为“ 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 }}之间的整个代码都用红色下划线。而且我不知道该怎么办,请帮助我。

1 个答案:

答案 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}};