【问题标题】:How to initialize a constant int to use for array size?如何初始化一个常量 int 以用于数组大小?
【发布时间】:2015-07-05 01:43:10
【问题描述】:

我有一个静态整数变量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 作为用户输入读入,但在一个游戏循环内只读取和分配一次,但如果我关闭/重新启动/玩新游戏,它需要再次读入用户输入并分配一次。

【问题讨论】:

  • nPlayersunits 仅在用户输入后在运行时而不是在编译时声明/初始化时,您不应该采取一种方法吗?
  • 只是为了确定,你真的想要一个向量数组吗?或者你真的想要一个向量来保存nPlayers 项目?根据您发布的代码,方法是使用std::vector&lt;std::vector&lt;Unit&gt;&gt;,而不是向量数组。
  • 我刚刚做了一个编辑来澄清。
  • @awar 向量向量等同于您的向量数组。在构造时,只需适当调整向量的大小。
  • 这如何解决我在编辑中所说的每个向量对每个玩家都不同的问题?具体来说,我的向量数组中的每个索引“i”代表每个玩家“i”的单位向量?

标签: c++ arrays constants


【解决方案1】:

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

相反,创建一个std::vector&lt;std::vector&lt;Units&gt;&gt; 并在构造时适当调整其大小。如果您需要重置大小,请使用成员函数调整向量的大小。

例子:

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() 函数知道自己的大小。携带可能会为您提供此信息的不必要变量会为您带来错误。

【讨论】:

  • 啊,我不知道你可以像这样初始化向量的大小,我试图做类似std::vector&lt;std::vector&lt;Unit&gt;&gt; units(8); 的事情,但这不起作用。非常感谢!
【解决方案2】:

只有 整数常量表达式 允许在 C++ 中的数组声明中作为数组大小。 const int 对象初始化为 不是整数常量表达式(您的 Game::numPlayers 不是,因为它是从用户那里读取的),它本身不符合整数常量表达式的条件。 p>

这里的底线是,无论您如何对其进行切片,都不可能将运行时值潜入 C++ 中的数组声明中。 C++11 确实支持一些类似 C99 风格的可变长度数组,但你的情况(一个成员数组)无论如何都没有被它覆盖。

如果数组大小是运行时间值,请使用std::vector。在您的情况下,这将成为std::vector of std::vectors。

【讨论】:

  • 如果Game::numPlayers 只分配一次怎么办?它必须将其作为输入读入,但它只分配一次。那我怎么能重组我的代码呢?另外,如果您查看我的编辑,我认为向量的向量不会完成我想要的。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多