无法将类push_back到 for 循环中的对象向量中

Can't push_back a class into an object vector inside a for loop

本文关键字:循环 for 向量 对象 back push      更新时间:2023-10-16

不能调用push_back函数

void GameState::InitialiseBullet(float x, float y, float vx, float vy)
{
    Bullet* bullets = new Bullet();
    bullets->SetSize(5.f, 20.f);
    bullets->AddFrame("./images/bullet.png");
    bullets->Play();
    bullets->SetX(x);
    bullets->SetY(y);
    bullets->velocityX = vx;
    bullets->velocityY = vy;
    bullets->isActive = true;
    gameObjects.push_back(bullets);
}

当它位于以下for循环

中时
for (auto& object : gameObjects)
{
    //Determine the type at runtime
    if (dynamic_cast<Player*>(object) != 0)
    {
        //Process player-specific logic
        PlayerLogic(dynamic_cast<Player*>(object), a_fTimeStep);
    }
//Determine the type at runtime
if (dynamic_cast<Bullet*>(object) != 0)
{
    //Process bullet-specific logic
    BulletLogic(dynamic_cast<Bullet*>(object), a_fTimeStep);
}
if (dynamic_cast<Enemy*>(object) != 0)
{
    //Process enemy-specific logic
    Enemy* enemy = dynamic_cast<Enemy*>(object);
    EnemyLogic(enemy, lowerAliens);
    if (enemy->GetIsActive() == true)
    {
        allDead = false;
    }
}
//Update and draw our objects
object->Update(a_fTimeStep);
object->Draw();
}

调用函数的代码段:

if (createBullet == true)
{
    InitialiseBullet(bulletX, bulletY, 0, 500);
    createBullet = false;
}

该代码在for循环之外工作。然而,我需要for循环来提供访问每个玩家、敌人和子弹对象的权限。是否有一种方法push_back到一个vector内的for循环是基于相同的向量?当它在循环内时,我得到一个"表达式:向量迭代器不兼容"的错误。什么好主意吗?c++编程新手

看起来你正在推入你正在迭代的同一个向量,这意味着,你正在强制项重新分配和迭代器无效;换句话说,你的数据移动到不同的位置,使用的迭代器无效。


我很少看到你真的需要迭代和追加相同的向量的情况,所以再检查一下你的代码。

如果你真的需要这样做,这样迭代:

for (size_t i = 0; i < gameObjects.size(); ++i)
{/*Some code*/}

同样使用此方法,您应该使用gameObjects[i].而不是it->

它只是一个指针向量,所以不是很大。

添加的对象可能更小。

可以复制vector对象,在插入vector对象的同时遍历复制对象。

可以在迭代时将新项放入新的空向量中,然后在最后将它们拼接到实际向量上。

要删除对象,你可以做这两件事,或者你可以简单地设置一个标志"isZombie",然后在最后删除所有的僵尸。

这些不是唯一的答案,但它们都有效。

当使用迭代器遍历vector对象时,不能在for循环中修改vector对象

快速谷歌给了我这个;这似乎很适合你的情况。

可能是因为push_back…导致内部vector中的重新分配使其所有迭代器失效。

来源:http://www.cplusplus.com/forum/beginner/64854/

当我假设你使用迭代器是因为你的错误信息时,我理解对了吗?

你应该问自己的一个问题是,为什么你要向这个向量添加实例,也许你应该稍微重新考虑一下你的设计,以避免这种情况。