0

.remove とオブジェクトをポインターとして使用して std::list からオブジェクトを削除することは可能ですか?

私はポインターとかなり混乱しています。たとえば、次のクラスがあります。

class AsteroidGen{
    public:
        std::list<Asteroid*> listAsteroids;
        void AsteroidGen::generateAsteroid(int amount, int delet);
        void AsteroidGen::DrawAsteroids();
};

これには、私の小惑星オブジェクトへのポインタのリストがあります。これはポインターなので、ポインターを使用してそれを調べて削除できると思います。

私のメイン クラスでは、AsteroidGen のインスタンスを作成し、リストにデータを入力して描画します。これはすべてうまくいきます。次に、弾丸が衝突したリストから項目の 1 つを削除しようとします。

bool CheckBulletCollision(Lazer lazer, AsteroidGen asteroids){
    bool collision = false;
    for each(Asteroid *c in asteroids.listAsteroids){
        Position pos = c->pos;
        float lazx = lazer.mPos.x;
        float lazy = lazer.mPos.y;
        float lazz = lazer.mPos.z;
        float distance = sqrt(pow(pos.x - lazx, 2) + pow(pos.y - lazy, 2) + pow(pos.z - lazz, 2));
        if( distance < 2.05){
            asteroids.listAsteroids.remove(c);
            lazergone = true;
            break;
        }
    }
    return collision;
}

コードを 1 行ずつ調べて何が問題なのかを確認しようとしましたが、次のフレームでリスト項目が実際に削除されません。私はおそらくポインターを正しく使用していませんが、それでも難しいと思います。

誰かアドバイスをください!さらにコードを追加する必要があるかどうか教えてください。これで十分だと思いました。ありがとうございます。

4

1 に答える 1

3

AsteroidGen値で関数に渡しています。これは、そのコピーが作成され、関数がローカル コピーで機能することを意味します。ローカル コピーは、関数の終了時に破棄されます。小惑星は確かにリストから削除されますが、コピーに保存されているリストからは削除されます。

関数内のオブジェクトを変更する場合AsteroidGenは、参照渡しする必要があります。

bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
  // ... rest of code as before
}
于 2012-11-30T09:49:59.487 に答える