C++ Can';t将类推回for循环中的对象向量

C++ Can';t将类推回for循环中的对象向量,c++,for-loop,vector,C++,For Loop,Vector,我不能调用将u推回向量的函数 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->S

我不能调用将u推回向量的函数

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();
}

该代码在for循环之外时有效。但是,我需要for循环来提供对我的每个玩家、敌人和子弹对象的访问。有没有办法将_推回基于相同向量的for循环中的向量?当它在循环中时,我得到一个“表达式:向量迭代器不兼容”错误。有什么想法吗?新的C++编程。

< P>当使用迭代器循环你的向量时,你不能在这个“for循环”中修改向量。

一个快速的谷歌给了我这个;看起来很适合你的情况

可能是因为推回。。。引起内部冲突 在向量中重新分配,因此其所有迭代器都无效

资料来源:

当我假设您由于错误消息而使用迭代器时,我是否正确地理解了您


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

看起来您正在推进与正在迭代的向量相同的向量,这意味着,您正在强制项重新定位和迭代器失效;换句话说,您的数据移动到不同的位置,使用的迭代器变得无效


我很少看到您真正需要迭代并附加相同向量的情况,所以请再次查看您的代码

如果确实需要这样做,请按以下方式迭代:

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

同样使用这种方法,你应该使用
游戏对象[i]。
而不是
它->
它只是一个指针向量,所以它不是很大

添加的对象可能更小

您可以创建向量的副本,并在插入到真实副本时迭代该副本

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

要删除对象,您可以执行以下任一操作,或者只需设置一个标志“isZombie”,然后在最后删除所有僵尸


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

-1当使用迭代器在向量中循环时,您不能在此“for循环”中修改向量内容。我不这么认为,你可以…我的错,用错误的方式表达我自己,谢谢你的留言!谢谢大家。最后我把它们分成了不同的向量,把它们作为一个向量的一部分,速度太慢,而且有问题。我是在创建了一个单独的向量一段时间后这样做的,这个向量充当了将子弹推回到主向量的队列。
for (size_t i = 0; i < gameObjects.size(); ++i)
{/*Some code*/}