##前提・分からない事
シューティングゲームを作ろうとしていて、敵キャラクターの管理をリストで行っています。ゲームはステージ制でステージクリアした際にそのステージのエネミーのリストをイテレーターを使って一度全てデリートしようとしているのですが、うまくいかず、イテレーターが破壊されて例外処理されてしまいます。
イテレーターを破壊せずに一度全ての敵キャラクターのリストを削除するにはどうすればよいでしょうか?
##ソースコード
C++
1class SceneManager 2{ 3private: 4 //一部省略 5 bool goal = false; 6 7 int clear = 2; 8 int stage = 1; 9 10public: 11 12 SceneManager() 13 { 14 sequence.change(&SceneManager::play_stage_1); 15 } 16 17 Player* player; 18 Target* target; 19 20//敵キャラクタークラスのリストとイテレーター 21 std::list<Cat*>cats; 22 std::list<Cat*>::iterator C_it; 23 24 std::list<Rabbit*>rabbits; 25 std::list<Rabbit*>::iterator R_it; 26 27 std::list<Cancer*>cancers; 28 std::list<Cancer*>::iterator K_it; 29 30 31 CSequence<SceneManager>sequence; 32}; 33 34//ソースコードの一部 35 36#define SAFE_DELETE(p) {\ 37 if (p) {\ 38 delete p; \ 39 p = nullptr; \ 40 }\ 41} 42 43C_it = cats.begin(); 44R_it = rabbits.begin(); 45 46while (R_it != rabbits.end()) 47{ 48 if (*target->get_clear()) 49 { 50//ここでイテレーターの破壊が起きる 51 safeDelete(*R_it); 52 rabbits.erase(R_it); 53 continue; 54 } 55 56 R_it++; 57} 58 59 60while (C_it != cats.end()) 61{ 62 (*C_it)->draw(); 63 (*C_it)->move(*player->get_Y(), *player->get_Wait()); 64 65 if (*(*C_it)->get_X() <= -100) 66 { 67//個々の処理だけ問題なくできる 68 SAFE_DELETE(*C_it); 69 C_it = cats.erase(C_it); 70 71 continue; 72 } 73 if (*target->get_clear()) 74 { 75//例外は起きないが固まる 76 SAFE_DELETE(*C_it); 77 C_it = cats.erase(C_it); 78 continue; 79 } 80 81 C_it++; 82 }
##試したこと
別のイテレーターを用意してauto temp = R_it;
という風に別のリストに格納したりもしましたが、駄目でした。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/30 07:39
2019/11/30 07:52
2019/11/30 08:24