0

リストと少し混乱しています。下記参照:

int ParticleSystemManager::CreateParticleSystem()
{
    ParticleSystem* system = new ParticleSystem(Vector3(), Vector3(), 10, 1);
    system->SetLifeTime(200);

    list<ParticleSystem>::iterator it = particleSystems.begin();

    particleSystems.insert(it, *system);

    selectedParticleSystem = system;

    return 0;
}

私がやりたいことは、作成したばかりの粒子システムを取得して、粒子システムのリストに追加することですが、追加した粒子システムをポインターに格納することも望んでいます。ただし、リストを反復処理すると、メモリの場所が selectedParticleSystem ポインターによって格納された場所と異なることに気付きました。どうすれば同じにできますか?アップデートは以下です。

void ParticleSystemManager::Update(float elapsedTime)
{
    for (std::list<ParticleSystem>::iterator iterator = particleSystems.begin(), end = particleSystems.end(); iterator != end; ++iterator) 
    {
        iterator->Update(elapsedTime);
    }
}
4

2 に答える 2

1

Oliによる回答への追加:C ++ 11を使用する場合は、代わりにemplaceを使用して、リストに新しいParticleSystemを直接作成できます。

particleSystems.emplace(particleSystems.begin(),Vector3(), Vector3(), 10, 1);
particleSystems.begin()->SetLifeTime(200);

selectedParticleSystem=particleSystems.begin();
于 2012-12-31T13:16:16.407 に答える
1

ただし、リストを反復処理すると、メモリの場所が selectedParticleSystem ポインターによって格納された場所と異なることに気付きました。

これは、オブジェクトのコピーstd::list::insertを作成するためです。

オプションは次のとおりです。

  1. 代わりに of ポインターを作成しますlist(ただし、いくつかの理由から、代わりにスマート ポインターを使用することをお勧めします)。

  2. リスト内のオブジェクトへのポインターを取得し、代わりにそれを格納します。何かのようなもの:

    selectedParticleSystem = &(*particleSystems.insert(it, *system));
    

    これを行うと、もちろんdelete元のオブジェクトが必要になります。そうしないと、メモリ リークが発生します。

于 2012-12-31T13:11:53.593 に答える