这是Linux上的C ++。我在运行时遇到错误,并且缩小了代码范围,这是自定义对象的构造函数。我要做的是创建一个新线程并将函数传递给它。在此函数中,我这样调用构造函数:

ColorNinja cn(gameData->difficulty);


gameData是也传递给线程的结构,其中difficultyint成员变量。

我不完全了解错误或确切原因。有人有见识吗?

这是构造函数。如果需要,我可以提供更多代码。

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"};

10-07 15:29