这是Linux上的C ++。我在运行时遇到错误,并且缩小了代码范围,这是自定义对象的构造函数。我要做的是创建一个新线程并将函数传递给它。在此函数中,我这样调用构造函数:
ColorNinja cn(gameData->difficulty);
gameData
是也传递给线程的结构,其中difficulty
是int
成员变量。我不完全了解错误或确切原因。有人有见识吗?
这是构造函数。如果需要,我可以提供更多代码。
ColorNinja::ColorNinja(int difficulty) {
// create the engine that will generate random numbers
random_device rand;
mt19937 engine(rand());
int randomNumber = 0;
// possible colors that can be present on the randomly-generated game board
vector<string> possibleColors = {"red", "blue", "yellow", "green"};
uniform_int_distribution<int> distribution2(0, possibleColors.size());
// build the game board by choosing and inserting random colors
for (int i = 0; i < 4; i++) {
randomNumber = distribution2(engine);
gameBoard.push_back(possibleColors[randomNumber]);
}
// print the game board
cout << "gameBoard.size(): " << gameBoard.size() << endl;
for (string s : gameBoard) {
cout << s << endl;
}
}
最佳答案
初始化possibleColors.size()-1
时需要使用distribution2
:
std::uniform_int_distribution<int> distribution2(0, possibleColors.size()-1);
std::uniform_int_distribution
的两个构造函数参数是要生成的最小值和最大值。通过使用possibleColors.size()
作为最大值,您可以允许生成器返回可能超出数组范围的索引。如果您使用了possibleColors.at(randomNumber)
,那么如果真的发生了,则会抛出一个std::out_of_range
错误。使用possibleColors[randomNumber]
不会执行任何边界检查,因此很高兴会采用无效的索引,然后您的代码将具有未定义的行为。因此,重要的是初始化生成器以仅生成有效索引。附带说明:由于
possibleColors
是固定数组,请考虑使用std::array
代替std::vector
:#include <array>
std::array<string, 4> possibleColors{"red", "blue", "yellow", "green"};