2015-06-23 2 views
0

Я использую этот код:Перечисления из другого класса в C++ (с SFML)

void GameObjectManager::DrawHUD(sf::RenderWindow& renderWindow) 
{ 
    std::map<std::string, VisibleGameObject*>::const_iterator itr = _gameObjects.begin(); 
    while (itr != _gameObjects.end()) 
    { 
     //if (itr->second->GetObjectType() == VisibleGameObject::HUD) 
     //{ 
      itr->second->Draw(renderWindow); 
      itr++; 
     //} 
    } 
} 

Чтобы нарисовать все элементы ObjectType HUD. ObjectType - это перечисление в моем другом классе VisibleGameObject. Если я использую косые черты в моем коде (поэтому, когда я не проверяю перечисление), все работает нормально. Но когда я хочу рисовать объекты ObjectType HUD, моя программа просто застревает в режиме отладки. У меня нет ошибок в отладке или что-то еще. Он просто застрял в рисовании всего.

Кто-нибудь видит, что я делаю неправильно?

Спасибо заранее,

Xentro

+0

Подумайте о том, он, с этим условием, итератор движется вперед только тогда, когда элемент является элементом hud ... Вы должны использовать цикл for/foreach. – Borgleader

+0

Омг, это так глупо, спасибо, что указали это. – Xentro

ответ

3

Проблема у Вас есть, если условие не верно, то вы никогда не увеличивать итератор. Если вы никогда не увеличиваете итератор, он никогда не будет равен end(). Вы должны всегда увеличивать итератор и в вашем случае заявления сделать вашу обработку:

void GameObjectManager::DrawHUD(sf::RenderWindow& renderWindow) 
{ 
    std::map<std::string, VisibleGameObject*>::const_iterator itr = _gameObjects.begin(); 
    while (itr != _gameObjects.end()) 
    { 
     if (itr->second->GetObjectType() == VisibleGameObject::HUD) 
     { 
      itr->second->Draw(renderWindow); 
     } 
     itr++; // unconditional increment. 
    } 
} 

Если вы хотите, вы можете использовать варьировались основой для петель из C++ 11 и вверх, как:

void GameObjectManager::DrawHUD(sf::RenderWindow& renderWindow) 
{ 
    for (auto & e : _gameObjects) 
    { 
     if (e.second->GetObjectType() == VisibleGameObject::HUD) 
      e.second->Draw(renderWindow); 
    } 
} 
+0

Большое спасибо, действительно ошибка новобранец: s – Xentro

+0

Это действительно должно быть для цикла for/off, хотя – Borgleader

Смежные вопросы