在引发 'std::out_of_range' 实例后不断被终止调用

Keeps on getting terminate called after throwing an instance of 'std::out_of_range'

本文关键字:调用 终止 实例 range std out of      更新时间:2023-10-16
bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) {
    ///**Get borad*/
    std::vector<Square*>  board = game->getBoard();
    int maxDistanceTravel = 0;
    int playerCanTravel = 0;
    //first square and last square must be present
    if (path[0] == 0 && path[path.size() - 1] == (board.size() - 1)) {
        for (int i = 0; i < path.size() - 1; i++) {
            /**Max distance of each board from player*/
            maxDistanceTravel = compute(board.at(path[i]), player);
            playerCanTravel = path[i + 1] - path[i];
            if ((playerCanTravel > maxDistanceTravel) && (playerCanTravel <= 0)) {
                return false;
            }
        }
        return true;
    }
    return false;
}

我是一个新的c++学习者,我一遍又一遍地得到同样的错误,但无法弄清楚是什么错了,它不是明显的一个超出范围,请帮助,谢谢。

我将首先尝试做一些早期检查,以确保您的输入是有效的。比如:

bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) {
  assert(!path.empty());
  if (path.size() < 2) return false; // or whatever your minimum size is.

只要您在这里,您可能应该删除其他输入。

bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) {
  assert(!path.empty());
  assert(game);
  assert(player);
  if (path.size() < 2) return false; // or whatever your minimum size is.

我有一个经验法则,使用引用的参数永远不应该为空。看起来在你的代码中,游戏是不允许为空的。所以也许你可以改变函数:

bool GameUtil::isValidPath(std::vector<int>& path, Player& player, Game& game) {
  assert(!path.empty());
  if (path.size() < 2) return false; // or whatever your minimum size is.

然后更改呼叫地点。可能在你的代码中有这样的东西:

// somewhere buried in your code:
Game * myGame = .../// however you created it.
Game * myPlayer = .../// however you created it.
GameUtil * myGameUtil = .../// however you created it.
...
auto isValid = myGameUtil->isValidPath(path, myPlayer, myGame);

改成:

// somewhere buried in your code:
Game * myGame = .../// however you created it.
Game * myPlayer = .../// however you created it.
GameUtil * myGameUtil = .../// however you created it.
...
auto isValid = myGameUtil->isValidPath(path, *myPlayer, *myGame);

希望对你有帮助。