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

我注意到,当遍历列表时,内存位置与 selectedParticleSystem 指针存储的位置不同。

那是因为std::list::insert创建了对象的副本

您的选择是:

  1. 改为创建 a listof 指针(尽管出于多种原因,您可能希望改用智能指针)。

  2. 获取指向列表内对象的指针,并将其存储起来。就像是:

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

    如果你这样做,你当然需要delete原始对象,否则你会有内存泄漏。

于 2012-12-31T13:11:53.593 回答
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 回答