質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

951閲覧

イテレーターが破壊される原因と対処法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/09 06:33

編集2021/02/09 06:42

提示コードですが。コメント部のコードでアクセスエラーになります。どうすればいいのでしょうか?stage->getMapObject();はマップのベクターなのですがその要素を指定した要素を削除するコードなのですが削除する例外が出てしまいます。どうすればいいのでしょか?

イメージ説明

cpp

1 2void Scene::Update() 3{ 4 stage->Update(); 5 player->Update(); 6 7 8 // プレイヤーとブロックの当たり判定 9 for (std::vector<MapObject>::iterator itr = stage->getMapObject().begin(); itr != stage->getMapObject().end(); itr++) 10 { 11 //printf("%d\n",itr->mCol.getSize().x); 12 if (Intersect_Rect_2D(itr->mCol,player->mCol) == true) 13 { 14 if (itr->getObjectType() == ObjectType::Item) 15 { 16 printf("あああ\n"); 17 itr = stage->getMapObject().erase(itr);////////// 18 } 19 20 player->Fix(itr->mCol.getPosition(), itr->getObjectType()); 21 22 23 } 24 } 25 26}

cpp

1#ifndef ___STAGE_HPP_ 2#define ___STAGE_HPP_ 3 4#include "MapObject.hpp" 5#include "Object.hpp" 6#include "../Entry.hpp" 7 8 9#include <iostream> 10 11// 画面のセルの数 12#define SCREEN_WIDTH_CELL ((int)((int)SCREEN_WIDTH / CELL)) 13#define SCREEN_HEIGHT_CELL ((int)((int)SCREEN_HEIGHT / CELL)) 14 15 16class Stage : Actor_2D 17{ 18public: 19 Stage(Entry* e); 20 21 ~Stage(); 22 23 void Update() override; 24 void Draw()override; 25 26 std::vector<MapObject> getMapObject(); //マップオブジェクトを取得 27 28private: 29 30 31 32 std::vector<MapObject> Area; 33 34 35 36}; 37 38#endif; 39

cpp

1#include "../../Header/Game/Stage.hpp" 2 3 4//コンストラクタ 5Stage::Stage(Entry* e) : Actor_2D() 6{ 7 8 std::shared_ptr<TextureData> sprite = LoadTexture("Assets/Block.png"); 9 std::shared_ptr<TextureData> Item_sprite = LoadTexture("Assets/Item.png"); 10 11 12 13// printf("X: %f\n", SCREEN_WIDTH / (float)CELL); 14// printf("Y: %f\n",SCREEN_HEIGHT / (float)CELL); 15 16 17 // ステージ 18 int Map[SCREEN_HEIGHT_CELL][SCREEN_WIDTH_CELL] = 19 { 20 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 21 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 22 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 23 {0,0,0,0,0,0,3,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 24 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 25 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0}, 26 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 27 {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 28 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0}, 29 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 30 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 31 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 32 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0}, 33 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 34 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 35 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 36 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 37 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 38 }; 39 40 41 42 for (int y = 0; y < SCREEN_HEIGHT_CELL; y++) 43 { 44 for (int x = 0; x < SCREEN_WIDTH_CELL; x++) 45 { 46 47 // ブロック 48 if (Map[y][x] == 1) 49 { 50 Box_Collision_2D col; 51 col.setEnable(true); 52 col.setPosition(glm::ivec2(CELL * x,( -CELL * y))); 53 col.setSize(glm::ivec2(CELL, CELL)); 54 TextureUV uv; 55 uv.start = glm::vec2(0, 0); 56 uv.end = glm::vec2(CELL, CELL); 57 58 Area.push_back(MapObject(e, ObjectType::Brick, sprite, uv, glm::ivec2(CELL * x, (-CELL * y)), col)); 59 60 //レンガ 61 }else if (Map[y][x] == 2) 62 { 63 Box_Collision_2D col; 64 col.setEnable(true); 65 col.setPosition(glm::ivec2(CELL * x, (-CELL * y))); 66 col.setSize(glm::ivec2(CELL, CELL)); 67 TextureUV uv; 68 uv.start = glm::vec2(CELL, CELL); 69 uv.end = glm::vec2(CELL * 2, CELL * 2); 70 71 Area.push_back(MapObject(e, ObjectType::Block, sprite, uv, glm::ivec2(CELL * x, (-CELL * y)), col)); 72 } 73 74 // アイテム 75 else if (Map[y][x] == 3) 76 { 77 78 Box_Collision_2D col; 79 col.setEnable(true); 80 col.setPosition(glm::ivec2(CELL * x, (-CELL * y))); 81 col.setSize(glm::ivec2(CELL, CELL)); 82 TextureUV uv; 83 uv.start = glm::vec2(0, 0); 84 uv.end = glm::vec2(CELL , CELL); 85 86 Area.push_back(MapObject(e, ObjectType::Item, Item_sprite, uv, glm::ivec2(CELL * x, (-CELL * y)), col)); 87 } 88 } 89 } 90} 91 92 93std::vector<MapObject> Stage::getMapObject() 94{ 95 return Area; 96} 97 98 99void Stage::Update() 100{ 101 for (std::vector<MapObject>::iterator itr = Area.begin(); itr != Area.end(); itr++) 102 { 103 itr->Update(); 104 } 105} 106 107void Stage::Draw() 108{ 109 for (std::vector<MapObject>::iterator itr = Area.begin(); itr != Area.end(); itr++) 110 { 111 itr->Draw(); 112 } 113} 114 115//デストラクタ 116Stage::~Stage() 117{ 118 119} 120

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/02/09 06:36

stage->getMapObject() の実装はどうなってますか?
退会済みユーザー

退会済みユーザー

2021/02/09 06:36

ベクター型です。
int32_t

2021/02/09 06:38

それは現状の質問文を見ればわかります。コピーを返してますか、参照を返してますか。
退会済みユーザー

退会済みユーザー

2021/02/09 06:38

実態です。
int32_t

2021/02/09 06:41

コピーなのですね? というか、素直にコードを開示してください。
退会済みユーザー

退会済みユーザー

2021/02/09 06:42

開示しました。
guest

回答1

0

ベストアンサー

以前の質問とまったく同じ問題があります。

で、今回は Stage::getMapObject()::erase() を呼んでいますが、Stage::getMapObject() が返すのは Stage::Area のコピーなので、erase() しても何も意味がなさそうです。
getMapObject() は消してしまって、stage->CheckCollision(player) みたいなメソッドを足すのが簡単だと思います(vectorがコピーかどうかを気にする必要がなくなるので)。

投稿2021/02/09 06:53

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/09 07:18

参照型にすれば削除可能でしょうか?
int32_t

2021/02/09 07:22

参照で可能ですけども、とてもトラブルを起こしやすい設計で、避けるべきです。 あるクラスのデータメンバは、そのクラスのメソッドのみが変更するのが理想的です。
fana

2021/02/09 07:59

リンク張られてる前の質問に書いたけども, erase()で要素削除する以前に,一時オブジェクトから取得したitrがもうダメなんじゃないかと.
退会済みユーザー

退会済みユーザー

2021/02/09 08:15

ベクターを引数に取る関数を使って消したい要素を消すというプログラムで解決しました。
退会済みユーザー

退会済みユーザー

2021/02/09 08:26

ベクターを引数に取るやり方はベクトルが例外エラーを出すので違いました。 どうすればstageクラスのベクトルで要素を消せるのでしょうか?
int32_t

2021/02/09 09:08

どういうコードを書いて失敗しているのかわかりませんが、既にこの回答に書いたとおり、Stage にメソッドを足してその中でStage::Areaに対してループ&erase()すれば問題ないはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問