如何初始化一个常量int用于数组大小?

时间:2015-07-05 01:43:10

标签: c++ arrays const

我有一个静态整数变量Game::numPlayers,它作为用户的输入读入。然后我定义了以下类:

class GridNode
{
private:
    /* Members */
    static const int nPlayers = Game::numPlayers;
    std::vector<Unit> units[nPlayers];

    //...
};

这不会编译(&#34;静态数据成员的类内初始化程序不是常量表达式&#34;)。

我显然不能只分配Game::numPlayers的数组大小,我也尝试不初始化它并让构造函数完成工作,但这也不起作用。

我不明白我在这里做错了什么以及我可以做些什么来让它按预期工作。

我只是复制一个值,与static const int nPlayers = 8有什么不同,它将值8复制到nPlayers并且有效?

编辑:

为了澄清,我选择了一个向量数组,因为我希望每个节点都有一个快速访问单元容器,但每个用户/播放器有一个容器,以便区分哪些单元属于每个节点中的哪个播放器(例如,数组的索引0 =玩家1,索引1 =玩家2,索引2 =玩家3,依此类推),否则我只会有一个向量或向量向量。我认为地图可能有用,但我认为一组矢量可以更快地访问和推进。

此外,Game::numPlayers作为用户输入读入,但仅在一个游戏循环中读取和分配一次,但如果我关闭/重新启动/播放新游戏,则需要再次读入用户输入并分配一次。

2 个答案:

答案 0 :(得分:1)

在C ++中,只允许整数常量表达式作为数组声明中的数组大小。一个const int对象使用 not 一个整数常量表达式(你的Game::numPlayers不是,因为它是从用户读取的)而被初始化,它本身不符合整数常量表达

这里的底线是,不管你如何切片,都不可能将运行时值隐藏到C ++中的数组声明中。 C ++ 11确实支持一些C99风格的可变长度数组,但你的情况(一个成员数组)还是没有被它覆盖。

如果数组大小是run-tuime值,请使用std::vector。在您的情况下,std::vector将成为std::vector

答案 1 :(得分:1)

如果在运行时获取元素数量,我不明白为什么需要使用std::vector数组。

相反,创建一个std::vector<std::vector<Units>>并在构造时适当调整大小。如果你需要重置大小,请使用成员函数调整向量大小。

示例:

class GridNode
{
    private:
        /* Members */
        std::vector<std::vector<Unit>> units;

    public:
        GridNode(int nPlayers=10) : units(nPlayers) {}

        std::vector<Unit>& get_units(size_t player) 
        { return units[player]; }  // gets the units for player n

        void set_num_players(int nPlayers) 
        {  units.resize(nPlayers); }  // set the number of players

        int get_num_players() const { return units.size(); }
 };

 int main()
 {
     int numPlayers;
     cin >> numPlayers;
     //...
     GridNode myGrid(numPlayers); // creates a GridNode with 
                                    // numPlayers vectors.  
     //...
     Unit myUnit;
     myGrid.get_units(0).push_back(myUnit); // places a Unit in the 
                                            // first player
 }

此外,让无关变量告诉您​​向量的大小并不是一个好主意。 vector已通过调用vector::size()函数知道自己的大小。携带不必要的变量,据说可以为您提供这些信息,为您打开错误。