接收“向量迭代器不兼容”错误

问题描述:

我正在创建一个Uno游戏,并且我试图通过特定属性搜索对象向量。当程序到达Game :: player_selection()方法时它崩溃。除此之外,一切都在发挥作用。接收“向量迭代器不兼容”错误

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

class Card { 
public: 
    string get_colour(); 
    string get_type(); 
}; 

class Player { 
public: 
    vector<Card*> get_hand(); //Should this be a reference? 
private: 
    vector<Card*>current_cards; 
}; 


int main() { 
srand(time(NULL)); //Makes shuffle more random (different every time) 
Game my_game; 
Player new_player("Hank", "human"); 
Player jack_player("Jack", "human"); 
my_game.add_player(new_player); //Must create players before doing other tasks 
my_game.add_player(jack_player); //Must create players before doing other tasks 
my_game.setup_game(); 
my_game.display_players(); 

cout << "enter colour" << endl; 
cin >> colour; 
cout << "enter type" << endl; 
cin >> type; 

my_game.play_card_to_pile(my_game.player_selection("Jack", colour, type)); 
my_game.display_players(); 

Game.cpp

Card* Game::player_selection(string p_name, string colour, string type){ 
    vector<Player>::iterator p_iter; 
    vector<Card*>::iterator c_iter; 
    p_iter = find_if (game_players.begin(), game_players.end(), [&] (Player& p) -> bool{return p.get_name() == p_name;}); //Finds correct player 
    c_iter = find_if(p_iter->get_hand().begin(), p_iter->get_hand().end(), [&] (Card*& c) -> bool{return c->get_colour() == colour && c->get_type() == type;}); //Finds correct card 

    return (*c_iter);//Should return correct card 

} 

给出错误

Error message I receive

编辑

只需在此处发布,以供将来参考有关find_if检查和多个向量副本。因此该解决方案是:

Card* Game::player_selection(string p_name, string colour, string type){ 
    vector<Player>::iterator p_iter; 
    vector<Card*>::iterator c_iter; 
    p_iter = find_if (game_players.begin(), game_players.end(), [&] (Player& p) -> bool{return p.get_name() == p_name;}); 
    if (p_iter != game_players.end()){ 
     vector<Card*> hand = p_iter->get_hand();//Otherwise have multiple copies of the vector stored in different places in memory 
     c_iter = find_if(hand.begin(), hand.end(), [&] (Card*& c) -> bool{return c->get_colour() == colour && c->get_type() == type;}); 
     if (c_iter != hand.end()){ 
      return (*c_iter); //If found return found Card 
     } 
    } 
    return (get_pile_card()); //Else return a default 
} 

的问题是,get_hand返回一个vector由值,因此2调用get_hand创建不同的载体。你可以参考返回载体,或者只是调用get_hand一次:

vector<Card*> hand = p_iter->get_hand(); 
c_iter = find_if(hand.begin(), hand.end(), ... 

您也应该检查这两个呼叫find_if的结果,以确保他们真正找到满足谓词的项目。

+0

完成建议的更改(仅调用get_hand()一次)后,我现在得到错误:向量迭代器不能取消引用。你认为可能会造成这种情况? –

+0

可能是我答案的第二部分。通过检查'c_iter!= hand.end()' – porges

+0

非常好,谢谢你的帮助。我已经在3小时后开始工作了:D用lambda表达式和内存来解决问题。 –