Dein Code verursacht an mehreren Stellen Laufzeitfehler.
1. In der Schleife, die das Element sucht, dessen GetChoose()-Methode true liefert.
Sollte wider Erwarten
kein Element true liefern, bricht die Schleife nicht ab, inkrementiert den Iterator jenseits des letzten Elements der Liste und dereferenziert ihn.
2. Im if-else-Zweig, der das nächste Element auswählen soll.
m_itChoose kann nicht gleich m_spriteStaticList.end() sein, da List.end() einen Iterator auf das Element
nach dem letzten Element in der Liste liefert, also jenseits der Liste zeigt.
Es wird also immer der else-Zweig ausgeführt. Und in dem wird der Iterator inkrementiert, was einen Iterator auf das letzte Element innerhalb der Liste
jenseits der Liste zeigen lässt, und dann dereferenziert.
Wenn ich mir deinen Code so ansehe, soll m_itChoose immer auf das aktuell ausgewählte Element zeigen. Und du möchtest diesen Iterator ein Element weiter rücken.
Nichts einfacher als das:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
// aktuell ausgewähltes Element abwählen
(*m_itChoose)->Choose(false);
// Iterator weiter rücken und prüfen, ob wir jenseits der Liste gelandet sind
if (++m_itChoose == m_spriteStaticList.end())
m_itChoose = m_spriteStaticList.begin(); // falls wir jenseits der Liste gelandet sind zurück auf Anfang
// dieses Element auswählen
(*m_itChoose)->Choose(true);
|
Solange du zwischenzeitlich nicht das Element, auf das der Iterator verweist, löscht, funktioniert das. Das ist nämlich einer der Vorteile von list im Vergleich zum vector: Iteratoren bleiben auch über die Liste verändernde Operationen hinweg gültig (mit Ausnahme von Iteratoren auf gelöschte Elemente).