如何初始化常量 int 以用于数组大小
How to initialize a constant int to use for array size?
我有一个静态整数变量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
。
- 并行用于C++17中数组索引范围内的循环
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 虽然循环不适用于数组应用程序
- 重载运算符<<用于数组,无需类
- C++相当于 Python 的:用于数组索引
- 提升是否具有用于数组向量的智能指针
- 如何将`new`用于数组的指针
- SDL_RenderCopy() 不适用于数组
- unique_ptr<T> 用于数组专用化的 lambda 自定义删除器
- 用于数组、向量、内置类型、STL的C++模板函数
- 重载运算符<<用于数组
- 用于数组的C++模板,并了解它们的大小
- C++的 min_element() 不适用于数组
- Std::set_intersection用于数组和列表
- 如何初始化常量 int 以用于数组大小
- 编译器选择专门用于数组的模板,但随后尝试将数组参数强制转换为指针
- 当 auto 用于数组时,为什么它被转换为指针而不是引用?
- sizeof() 在 C/C++ 中用于数组