Verstehe ich das richtig, dass
getShotlist vorher eine Kopie der Liste zurückgegeben hat? Dann war das der Grund für dein Problem.
Schau dir mal diese Zeile aus deinem Code an:
|
C-/C++-Quelltext
|
1
|
std::list<CShot>::iterator itshot = _playerlist.back().getShotlist().begin();
|
Wenn
getShotlist eine Kopie der Liste zurückgibt, zeigt der Iterator auf das erste Element dieser Kopie. Aber was passiert dann mit der Kopie? Sie wird nirgendwo gespeichert und als Rückgabewert gilt sie als
temporäres Objekt. Mit anderen Worten: Nach dieser Zeile ist sie futsch. Dadurch wird natürlich auch der Iterator auf ihr erstes Element ungültig. Davon abgesehen wird in der while-Bedingung eine
neue Kopie der Liste zurückgegeben, dessen Iterator nicht mit dem Iterator der ersten Kopie vergleichbar ist (selbst wenn dieser noch gültig wäre).
Das erkärt auch, warum der Code in deinem Update funktioniert: Da wird die Listenkopie in einer Variablen gespeichert.
ok, es hätte auch gereicht, die Liste als Referenz zu übergeben. Allerdings kapier ich nicht warum, da die Liste selbst ja nicht verändert werden soll...
Du kannst sie auch als
const Reference zurückgeben, dann wäre sie nicht mehr änderbar. Alternativ könntest du natürlich auch die Iteratoren auf den Anfang und das Ende der Liste zurückgeben (wahlweise
iterator oder
const_iterator) anstatt der Liste selbst. Dadurch verhinderst du, dass die Methoden der Liste überhaupt aufgerufen werden können.