无法将类推回到for循环内的对象向量中

时间:2014-08-04 11:27:46

标签: c++ for-loop vector

我无法调用将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转换为基于相同向量的for循环内的向量?我得到一个&#34;表达式:矢量迭代器不兼容&#34;它在循环内部时出错。有任何想法吗? C ++编程新手。

3 个答案:

答案 0 :(得分:3)

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


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

如果你真的需要这样做,请以这种方式迭代:

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

同样使用此方法,您应使用gameObjects[i].代替it->

答案 1 :(得分:0)

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

添加的对象可能更小。

您可以制作矢量的副本,并在插入真实副本时迭代副本。

您可以在迭代时将新项目放入一个新的空矢量中,然后在最后将它们拼接到真实的矢量中。

要删除对象,您可以执行其中任何一项操作,或者只需设置标记“isZombie”,然后删除最后的所有僵尸。

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

答案 2 :(得分:-1)

当使用迭代器遍历矢量时,你不能在这个'for-loop'中修改矢量。

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

  

可能是因为push_back引起了内部问题   在向量中重新分配,因此它的所有迭代器都被无效。

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

由于您的错误消息,我在假设您使用迭代器时,我是否理解您。

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