如何初始化常量 int 以用于数组大小?
How to initialize a constant int to use for array size?
我有一个静态整型变量Game::numPlayers
,它是作为用户输入读入的。然后我定义了以下 class:
class GridNode
{
private:
/* Members */
static const int nPlayers = Game::numPlayers;
std::vector<Unit> units[nPlayers];
//...
};
这不会编译 ("in-class initializer for static data member is not a constant expression")。
我显然不能只分配 Game::numPlayers
的数组大小,我也尝试过不初始化它并让构造函数完成工作,但这也没有用。
我不明白我在这里做错了什么以及我还可以做些什么来让它按预期工作。
我只是复制一个值,这与将值 8 复制到 nPlayers
并起作用的 static const int nPlayers = 8
有何不同?
编辑:
为了澄清,我选择了一个向量数组,因为我希望每个节点都有一个快速访问的单元容器,但是每个节点都有一个容器 user/player 以便区分哪些单元属于哪个每个节点内的玩家(例如,数组的索引 0 = 玩家 1,索引 1 = 玩家 2,索引 2 = 玩家 3,等等),否则我将只有一个向量或向量的向量。我认为地图可能有效,但我认为向量数组可以更快地访问和推入。
此外,Game::numPlayers
作为用户输入读入,但在一个游戏循环中只读入并分配一次,但如果我close/restart/play一个新游戏,它需要读入用户再次输入并赋值一次
在 C++ 的数组声明中,只允许 整数常量表达式 作为数组大小。 const int
对象初始化为 不是 整数常量表达式(你的 Game::numPlayers
不是,因为它是从用户那里读取的),它本身不符合条件作为整型常量表达式。
这里的底线是,无论您如何切片,都不可能在 C++ 中将 运行 时间值潜入数组声明中。 C++11 确实支持一些类似于 C99 风格的可变长度数组,但是你的情况(一个成员数组)无论如何都不在它的范围内。
如果数组大小是 运行-tuime 值,请使用 std::vector
。在你的情况下,它将成为 std::vector
of std::vector
s.
我不明白为什么要使用 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()
函数已经知道它自己的大小。携带本应为您提供此信息的不必要变量会使您自己容易出错。
我有一个静态整型变量Game::numPlayers
,它是作为用户输入读入的。然后我定义了以下 class:
class GridNode
{
private:
/* Members */
static const int nPlayers = Game::numPlayers;
std::vector<Unit> units[nPlayers];
//...
};
这不会编译 ("in-class initializer for static data member is not a constant expression")。
我显然不能只分配 Game::numPlayers
的数组大小,我也尝试过不初始化它并让构造函数完成工作,但这也没有用。
我不明白我在这里做错了什么以及我还可以做些什么来让它按预期工作。
我只是复制一个值,这与将值 8 复制到 nPlayers
并起作用的 static const int nPlayers = 8
有何不同?
编辑:
为了澄清,我选择了一个向量数组,因为我希望每个节点都有一个快速访问的单元容器,但是每个节点都有一个容器 user/player 以便区分哪些单元属于哪个每个节点内的玩家(例如,数组的索引 0 = 玩家 1,索引 1 = 玩家 2,索引 2 = 玩家 3,等等),否则我将只有一个向量或向量的向量。我认为地图可能有效,但我认为向量数组可以更快地访问和推入。
此外,Game::numPlayers
作为用户输入读入,但在一个游戏循环中只读入并分配一次,但如果我close/restart/play一个新游戏,它需要读入用户再次输入并赋值一次
在 C++ 的数组声明中,只允许 整数常量表达式 作为数组大小。 const int
对象初始化为 不是 整数常量表达式(你的 Game::numPlayers
不是,因为它是从用户那里读取的),它本身不符合条件作为整型常量表达式。
这里的底线是,无论您如何切片,都不可能在 C++ 中将 运行 时间值潜入数组声明中。 C++11 确实支持一些类似于 C99 风格的可变长度数组,但是你的情况(一个成员数组)无论如何都不在它的范围内。
如果数组大小是 运行-tuime 值,请使用 std::vector
。在你的情况下,它将成为 std::vector
of std::vector
s.
我不明白为什么要使用 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()
函数已经知道它自己的大小。携带本应为您提供此信息的不必要变量会使您自己容易出错。