2017-07-21 22 views
0

私はC++を初めて使っています。ベクトルリストから特定のオブジェクトを削除する

私は、ベクトルから特定のポインタを削除し、そのオブジェクトを削除するメソッドを作成しようとしています。私が今持っているもの。ここです:

void Engine::destroyObject(GameObject* obj) { 

    if (obj == nullptr) { 
     std::cout << "Error: GameObject pointer given is null!" << std::endl; 
     return; 
    } 
    else if (m_GameObjects.empty()) { 
     std::cout << "Error: Trying to destroy GameObject while list is empty!" << std::endl; 
     return; 
    } 

    auto it = std::remove(m_GameObjects.begin(), m_GameObjects.end(), obj); 
    if (it != m_GameObjects.end()) { 
     delete obj; 
     m_GameObjects.erase(it, m_GameObjects.end()); 
    } 
} 

GameObject* Engine::findObject(std::string name) { 
    return *std::find_if(m_GameObjects.begin(), m_GameObjects.end(), [name](GameObject* e) { return e->getName() == name; }); 
} 

私はこのようなこれらのメソッドを呼び出しています:

GameObject* obj = findObject("Random"); 
destroyObject(obj); 

しかし、いくつかの理由で、私のプログラムがクラッシュしm_GameObjects.erase(it, m_GameObjects.end());でエラーで「ベクターイテレータないdereferencable」

私はit = m_GameObjects.erase(it, m_GameObjects.end());に回線を変更しようとしましたが、何も変更されませんでした。

ありがとうございます!

編集:ここでは、もう少し情報 ゲームオブジェクトがfindProjectメソッドが正常に動作します(名前など、いくつかのデータを持つ...)普通のクラス あります、それはエラーを引き起こしているの消去のためのラインです。

+0

再生できません:http://coliru.stacked-crooked.com/a/98a14577189a140f [mcve]を含むように質問を編集してください。このリンクは、そのリンクのように見えますが、実際には同じコードを取得するために必要なコードが含まれていますエラーがあります。 – aschepler

+5

おそらく無関係かもしれませんが、ベクトル内のオブジェクトに要求された名前がない場合、 'findObject'関数は未定義の動作をします。 – aschepler

+0

エンジンが関与していなければなりませんか? 'boost :: shared_ptr'を使うと、the_vector.erase(it)は呼び出されたオブジェクトデストラクタを取得します。 – lakeweb

答えて

0

so aschepler私のfindObject関数がnull値をチェックしていないことがわかりました(オブジェクトが存在しないか見つかりませんでした)ので、いくつかのチェックを追加しました。どうもありがとう!

GameObject* Engine::findObject(std::string name) { 
    auto it = std::find_if(m_GameObjects.begin(), m_GameObjects.end(), [name](GameObject* e) { return e->getName() == name; }); 

    if (it == m_GameObjects.end()) 
     return nullptr; 

    return *it; 
} 

次に、値がnullptrであるかどうかをチェックし、そうでなければ何もしませんでした。

関連する問題