【问题标题】:C++11 for loop syntax not working properlyC++11 for 循环语法无法正常工作
【发布时间】:2014-07-15 14:41:24
【问题描述】:

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

void PowerUp::update(FrameTime mFT) {
  if (!(bottom() >= windowHeight))
    shape.move(velocity * mFT);
  else
    onGround = true;
}

在我的 PowerUpManager 类中,我有一个 PowerUp 向量,这个函数可以一次更新所有 PowerUp:

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

,一切正常。这告诉我,这 2 位代码的含义有所不同。据我所知,前者只是后者的新 C++ 语法糖版本。有什么我想念的吗?

更奇怪的是我的draw all功能,

void PowerUpManager::draw(sf::RenderWindow& window) {
  for (auto powerUp : mPowerUps)
    powerUp.draw(window);
}

,工作正常,没有问题。

【问题讨论】:

    标签: c++ c++11 for-loop foreach


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!它是如此简单,以至于它从我的头上飞过。作为一个后续问题,我当前版本的绘制函数(没有引用)是否通过复制对象然后绘制它而增加了不必要的开销?
    • @Bluejay 是的,复制总是会增加一些额外的开销,因为它涉及调用复制构造函数。由于处理和实现引用的常用方法是使用指针,因此使用引用的开销与复制指针相同:指针的 4 或 8 字节副本并且没有函数调用,通常比对象复制的开销要少得多。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多