Klasseninstaz aus Liste löschen verursacht einen Fehler..
-
Hi,
Auf anraten des Autors des Buches, welches ich grade lese um C++ zu lernen, versuche ich das gelernte Wissen durch experiementieren zu festigen.
Damit das ganze nicht zu langweilig wird hab ich mir selber eine kleine Aufgabe gestellt. Ich versuche grade eine Abfrage zu erstellen die es dem Benutzer erlaubt eine Beliebiege Zahl von Instanzen der Klasse Raumschiffe zu erstellen. Danach wird ein Menue aufgerufen indem man 3 Funktionen zur Auswahl hat.
1. Ein Schiff in die Schlacht schicken wobei es zerstoert wird und aus der Liste geloescht werden soll.
2. Die liste anzeigen
3. Spiel beendenDas Problem ist nun bei Punkt 1. Wenn ich versuche das betreffende Raumschiff mit " lRaumschiffe.erease (*i); " aus der Liste zu löschen bekomme ich einen Fehler und das Programm stuertz ab. Beim kompelieren erhalte ich allerdings keinen Fehler..
Was ist verkehrt?
#include <iostream> #include <list> using namespace std; class CRaumschiff { private: //Membervariablen int mID; int mEnergie; public: //Memberfunktionen CRaumschiff (int ID) { mID = ID; cout << "Raumschiff " << mID << " wurde gebaut" << endl; } ~CRaumschiff () { cout << "Raumschiff: " << mID << " zerstört"; } //Life abfrage.. bool Lifeabfrage () { if (mEnergie == 0) { return true; } else { return false; } } int IDRueckgabe () { return mID; } void Kampf () { mEnergie = 0; cout << "Raumschiff wurde zerstoert" << mID << endl; } }; //Prototypen void AnzeigeFunktion (); int main () { //Variablen list<CRaumschiff*> lRaumschiffe; list<CRaumschiff*>::iterator i; int Anzahl; int Auswahl2 = 0; cout << "Wieviele Raumschiffe sollen gebaut werden? "; cin >> Anzahl; cout << endl; //Zeiger deklaieren CRaumschiff *TEMP = NULL; for(int j=0; j<Anzahl; j++) { TEMP = new CRaumschiff(j+1); lRaumschiffe.push_back(TEMP); } //Menue do { cout <<"\n\n1) Raumschiffe in die Schlacht schicken: " << endl; cout << "2) Raumschiffe anzeigen"<< endl; cout << "3) Beenden"<< endl; cout << "Eingabe machen: "; cin >> Auswahl2; switch(Auswahl2) { case(1): { cout << "Raumschiff NR? "; cin >> Auswahl2; for(i = lRaumschiffe.begin(); i != lRaumschiffe.end(); i++) { if ((*i)->IDRueckgabe()== Auswahl2) { (*i)->Kampf (); lRaumschiffe.erase(i); } } } break; case(2): { cout << "Es befinden sich " << static_cast<int> (lRaumschiffe.size()); cout << " Elemente in der Liste"; } break; case(3): { } break; default: { } } } while(Auswahl2 != 3); return 0; } void AnzeigeFunktion (list<CRaumschiff> testliste) { cout << "Es befinden sich " << static_cast<int> (testliste.size()); cout << " Elemente in der Liste"; }
-
mit erase entfernst du nur den Eintrag aus der Liste, das Objekt bleibt aber übrig!
CRaumschiff* pRaumschiff = (*i); pRaumschiff->Kampf (); lRaumschiffe.erase(i); delete pRaumschiff;
-
Meinst du mit Objekt den Reserviertenb Speicher? Sorry aber ist noch nicht ganz klar geworden, da mir objekt in dem Bezug nichts sagt.
-
mit
new CRaumschiff();legst du im Speicher eine neue Instanz dieser Klasse an und bekommst einen Zeiger darauf zurück. Die list<> hilft dir nur, diese Zeiger zu verwalten. Die Instanz wird erst durch
delete pRaumschiff;aus dem Speicher entfernt.
-
Kann ich auch einfach eine Klasseinstanz in der Lsite speichern anstatt des Zeigers?
Wenn das geht, reicht es dann aus einfach nur "erase" zu verwenden, da kein Sepicher reserviert wird?
-
ja, natürlich geht das auch und ist noch viel einfacher. du machst nur eine list<CRaumschiff> , legst die objekte nur so an:
list<CRaumschiff> listRaum; CRaumschiff x; listRaum.push_back(x);wenn du jetzt ein erase machst, ist die instanz wirklich weg.
-
Wenn ich aber jetzt keinen Zeiger verwände hab ich den nachteil das ich die Liste nur inerhalb einer FUnktion benutzen kann, da sie lokal ist oder?
-
Das hat nichts mit dem Inhalt der Liste zu tun (ob Pointer oder Objekt spielt keine Rolle), sondern mit der Liste selbst. Die muss solange leben wie Du sie brauchst: sorge dafür mit den Mitteln der Sprache.