【问题标题】:Can't push_back a class into an object vector inside a for loop不能将一个类 push_back 到 for 循环内的对象向量中
【发布时间】:2014-08-04 11:27:45
【问题描述】:

我无法调用将 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 循环内的向量?当它在循环内时,我收到“表达式:向量迭代器不兼容”错误。有任何想法吗? C++ 编程新手。

【问题讨论】:

    标签: c++ for-loop vector


    【解决方案1】:

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


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

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

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

    同样使用这种方法你应该使用gameObjects[i].而不是it-&gt;

    【讨论】:

      【解决方案2】:

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

      添加的对象可能更小。

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

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

      要删除对象,您可以执行上述任一操作,或者您可以简单地设置一个标志“isZombie”,然后在最后删除所有僵尸。

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

      【讨论】:

      • 谢谢大家。我最终将它们分成单独的向量,将它们保留为单个向量的一部分太慢且有问题。我在创建一个单独的向量一段时间后这样做了,该向量用作子弹队列,这些子弹被 push_backed 到主向量中。
      【解决方案3】:

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

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

      可能是因为 push_back ... 导致了内部 向量中的重新分配,因此它的所有迭代器都无效。

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

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

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

      【讨论】:

      • -1 当使用迭代器循环你的向量时,你不能在这个'for-loop'中修改向量的内容。我不这么认为,你可以...
      • 我的错,以错误的方式制定自己,谢谢你的注意!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多