Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11 for循环语法工作不正常_C++_C++11_For Loop_Foreach - Fatal编程技术网

C++ C++;11 for循环语法工作不正常

C++ C++;11 for循环语法工作不正常,c++,c++11,for-loop,foreach,C++,C++11,For Loop,Foreach,我正在使用SFML制作一个Arkanoid克隆,作为学习练习。对于PowerUp类,我有一个更新方法,如下所示: void PowerUp::update(FrameTime mFT) { if (!(bottom() >= windowHeight)) shape.move(velocity * mFT); else onGround = true; } 在我的PowerUpManager类中,我有一个通电向量,该函数用于一次更新所有通电向量: void Pow

我正在使用SFML制作一个Arkanoid克隆,作为学习练习。对于PowerUp类,我有一个更新方法,如下所示:

void PowerUp::update(FrameTime mFT) {
  if (!(bottom() >= windowHeight))
    shape.move(velocity * mFT);
  else
    onGround = true;
}
在我的PowerUpManager类中,我有一个通电向量,该函数用于一次更新所有通电向量:

void PowerUpManager::update(FrameTime mFT) {
  for (auto powerUp : mPowerUps)
    powerUp.update(mFT);
}
然而,这似乎不起作用。如果我运行这段代码,那么在产卵后,加电只是保持静止,不会像它们应该的那样向下移动。但是,如果我替换

for (auto powerUp : mPowerUps)
  powerUp.update(mFT);
用更传统但更老式的

for (int i{ 0 }; i < mPowerUps.size(); ++i)
  mPowerUps[i].update(mFT);

,工作正常,无任何问题。

问题在于循环中的
通电
是来自
mPowerUps
容器的副本。您需要使用引用:

for (auto& powerUp : mPowerUps)
    powerUp.update(mFT);

非常感谢。这是如此简单,它飞过去的权利,我的头。作为后续问题,我当前版本的draw函数(没有引用)是否会通过复制对象然后再绘制来增加不必要的开销?@Bluejay是的,复制总是会增加一些额外的开销,因为它涉及调用复制构造函数。由于处理和实现引用的一种常见方法是使用指针,因此使用引用的开销与复制指针的开销相同:指针的4或8字节副本,没有函数调用,通常比对象复制的开销小得多。
for (auto& powerUp : mPowerUps)
    powerUp.update(mFT);