2016-10-19 15 views
-1

こんにちは私のプロジェクトでは、すべてのモンスター、抽象クラスMobの部分に多型指標を保つためにベクターを使用しています。問題は戦闘中です - 私たちが攻撃していることを選択したイテレータを返す関数があります(ここではモンスターがない場合はベクトルの始まりをテストするためにスキップします)。C++ベクトル、消去が分かりません

vector<Mob*>::iterator Hero::TryAttack(vector <Mob*> monsters) 
{ 
    int trying_x = pos_x, trying_y = pos_y; 
    switch (DIR) 
    { 
     case UP: trying_y--; 
     case DOWN: trying_y++; 
     case LEFT: trying_x--; 
     case RIGHT: trying_x++; 
    } 

    if (!monsters.empty()) 
    { 
     for (vector <Mob*>::iterator i = monsters.begin(); i != monsters.end(); i++) 
     { 
      if ((*i)->pos_x == trying_x && (*i)->pos_y == trying_y) 
      { 
       return i; 
      } 
     } 
    } 

    return monsters.begin(); 
} 

と私はここでその機能を呼び出すとき:

switch (hero.CheckAction()) 
     { 
      case ATTACK: 
      { 
       //delete rat3; 
       if(!monsters.empty()) 
        monsters.erase(hero.TryAttack(monsters)); 

       test_map.Draw(monsters, NPCs); 
       break; 
      } 
      default: break; 
     } 

popingアサーションの失敗がありますが: img

私はその消去を削除した後、次の要素を返します理解が、どのように私はその一つだけを削除することができますベクトルの既存の要素ですか?

+0

'monsters.empty()'は 'monsters.begin()'を返します。これは 'monsters.end()'と一致します。 – user58697

+0

@ user58697、いいえ、 '!monsters.empty()'は呼び出し前にチェックしていないことを保証します。 –

+0

@yurikilochek '!monsters.empty()'はループを保護するだけです。私は 'TryAttack'の終わりに' return monsters.begin() 'について話しています。モンスターが空の場合、それを消去しようとする試みは致命的です。 – user58697

答えて

0
Hero::TryAttack(vector <Mob*> monsters) 

あなたは値でmonstersを渡しています。返されるイテレータは、存在しないベクトルのコピーを参照します。

Hero::TryAttack(vector <Mob*>& monsters) 
+0

残念ながら、それは動作しません –

+0

@KarolDrach何doesn 't? –

+0

同じ問題が発生します。他のフォーラムで誰か助言を私に使用する –

関連する問題