Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.07.2008, 22:01

[Erledigt] Iterator nicht dereferenzierbar

Hey Leute =)

ich hab mal wieder angefangen ein bisschen zu programmiern und wollte so ein spiel machen bei dem man umherfliegende Zielscheiben abschießen muss. Ich weiß das gibts schon, aber ich hab noch so nen paar ganz nette ideen mit denen man das etwas abwechslungsreicher machen kann.
Ich habe jetzt allerdings ein Problem:
Ich habe eine klasse TargetManager der sich um die verwaltung der ziele kümmert, also spawnen, verschwinden lassen, checken ob sie getroffen wurden und so weiter.
Dieser Manager hat eine std::list in der alle ziele verzeichnet sind. immer wenn ich jetzt eine Zielscheibe spawnen möchte, rufe ich folgende Funktion auf:

C-/C++-Quelltext

1
2
3
4
void TargetManager::createTarget()
{
    TargetList.push_back(new Target());
}


ich weiß nicht genau ob dsa funktioniert, aber ich hab ja eigentlich keine andere möglichkeit da diese liste der einzige pointer sein soll der auf das objekt zeigt.
so, wenn ich jetzt die liste durchgehe kommt aber die meldung
"Expression: list iterator not dereferencable"
hier ist noch der code:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void TargetManager::Update(double t, Vector2 MousePos)
{
    std::list<Target*>::iterator Iter;
    for(Iter = TargetList.begin(); Iter != TargetList.end(); ++Iter);
    {
        if((*Iter)->isHitted(MousePos))
            TargetList.erase(Iter);
        else
            (*Iter)->Update(t);
    }
}

isHitted soll überprüfen ob das ziel getroffen wurde und falls ja muss es natürlich aus der liste gelöscht werden.
und bei isHitted kommt nun diese meldung, ich hab das gefühl dsa es etwas damit zutun, könnt ihr mir vllt helfen? =)

Danke im voraus,
TwoThirds

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.07.2008, 22:07

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    for(Iter = TargetList.begin(); Iter != TargetList.end(); );
    {
        if((*Iter)->isHitted(MousePos))
{
delete (*Iter);
            Iter = TargetList.erase(Iter);
}
        else
{
            (*Iter)->Update(t);
++Iter
}
    } 


EDIT:
Noch Erklärung: :)
Du hast da ja Zeiger drin, die du per new angefordert hast, also shcön freigeben, dann den Eintrag löschen und neuen iterator speichern. erease gibt dir den nächsten Iterator zurück. Wenn du einen iterator entfernst, darfst du den nicht mehr brauchen, auch nichtmal inkrementieren. Also einfach so, wie oben vorgehen und du hast keine Probleme. ;)

3

26.07.2008, 22:13

Achso, ich war davon ausgegangen das erase den speicher auch freigibt, aber das man den Iterator neusetzen muss wusste ich nicht. Danke :)
Edit: hat sich geklärt ;)

Werbeanzeige