如何初始化常量 int 以用于数组大小

How to initialize a constant int to use for array size?

本文关键字:用于 数组 int 初始化 常量      更新时间:2023-10-16

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

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

这不会编译("静态数据成员的类内初始值设定项不是常量表达式"(。

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

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

我只是在复制一个值,这与将值 8 复制到nPlayers中并工作的static const int nPlayers = 8有什么不同?

编辑:

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

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

我不明白如果在运行时获得元素数量,为什么需要使用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() 函数知道自己的大小。 携带不必要的变量,据说可以为您提供此信息,从而为错误打开自己。

在 C++ 的数组声明中,只允许整数常量表达式作为数组大小。一个const int对象由不是整型常量表达式的东西启动(你的Game::numPlayers不是,因为它是从用户那里读取的(,它本身不符合整备常量表达式的条件。

这里的底线是,无论您如何切片,都不可能将运行时值潜入 C++ 中的数组声明中。C++11 确实支持 C99 样式的可变长度数组的一些外观,但无论如何它都没有涵盖您的情况(成员数组(。

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