我无法调用将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 ++编程新手。
答案 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/
由于您的错误消息,我在假设您使用迭代器时,我是否理解您。
你应该问自己的一个问题是为什么你想要向这个向量添加实例,也许你应该稍微重新考虑你的设计以避免这种情况。