2014-07-15 2 views
3

저는 학습 연습으로 SFML을 사용하여 Arkanoid 클론을 만들고 있습니다.루프 구문이 제대로 작동하지 않는 C++ 11

내 PowerUpManager 클래스에서
void PowerUp::update(FrameTime mFT) { 
    if (!(bottom() >= windowHeight)) 
    shape.move(velocity * mFT); 
    else 
    onGround = true; 
} 

, 내가하는 파워 업 벡터를 가지고 있고이 기능을 한 번에 모든 파워 업의를 업데이트 : 파워 업 클래스의 경우, 나는이 같은 업데이트 방법이

그러나
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++ 구문 설탕 버전이었습니다. 내가 빠진 것이 있습니까? 심지어 낯선 무엇

내 무승부 모든 기능

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

은 벌금과 문제없이 작동한다는 것입니다.

답변

12

문제는 루프 powerUp은 컨테이너의 복사본입니다. 참조를 사용해야합니다.

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

고맙습니다! 그것은 매우 간단해서 내 머리를 지나치게 날아갔습니다. 후속 질문으로, 내 현재 버전의 그리기 기능 (참조없이) 본질적으로 개체를 복사하여 그리기 불필요한 오버 헤드를 추가합니까? – Bluejay

+0

@Bluejay 예, 복사 생성자를 호출하는 과정에서 항상 복사 작업에 약간의 오버 헤드가 추가됩니다. 참조를 처리하고 구현하는 일반적인 방법은 포인터를 사용하는 것이므로 참조를 사용하는 오버 헤드는 포인터를 복사하는 것과 같습니다. 포인터의 4 또는 8 바이트 사본이며 함수 호출이 없으며 일반적으로 객체 복사보다 오버 헤드가 훨씬 적습니다. –

관련 문제