dynamisches Objekt in Liste löschen



  • Hi,

    ich lege mehrer Dynamische Objekte in einer Liste an:

    list <Item*> itemliste;
    

    Nun möchte ich gerne einige dieser dynamisches Objekte löschen.
    Wie kann ich dies am Besten machen?

    if (item_exist(input) == true)
    	{
    
    		//itemliste.erase();
    
    		cout << "Gegenstand entfernt!" << endl;
    	}
    	else
    	{
    		cout << "Kein Gegenstand entfernt!" << endl;
    	}
    


  • Musst du wirklich ein Item* statt Item haben? Damit verlierst du nämlich einen Grossteil der Vorteile von Containern (automatische Speicherverwaltung).

    Falls du Zeiger brauchst und aus einem Grund nicht auf entsprechende Alternativen wie Boosts Pointer-Container ausweichen willst, kannst du das so machen:

    std::list<Item*>::iterator iter; // dein zu löschendes Element
    
    delete *iter;
    itemliste.erase(iter);
    


  • Zuerst holst du dir den Iterator auf das Element, was du löschen willst. Dann zerstörst du das Objekt (ich nehme mal an, dass du dynamisch new meinst) und dann löscht du das Objekt mit erase.

    Überlege dir aber, ob es nötig ist überhaupt dynamisch Speichern anzufordern, oder es reicht die Items per Kopie in den Container zu werfen. Dann reicht ein erase.

    list <Item> itemliste;
    


  • DIe Klasse Item ist eine Basisklasse mit 3 Subklasse.
    Daher die Sache mit den Zeigern.

    Würde es so funktionieren?
    Kann z.Z noch nicht testen. muss zuvor noch ein anderes Problem beseitigen.

    list<Item*>::iterator iter; // dein zu löschendes Element
    
    		for (iter = itemliste.begin(); iter != itemliste.end(); iter++) 
    		{
    			if((*iter)->get_name() == input)
    			{
    				delete *iter;
    				itemliste.erase(iter);
    			}
    		}
    


  • Nicht ganz.

    So:

    for (iter = itemliste.begin(); iter != itemliste.end();)
            {
                if((*iter)->get_name() == input)
                {
                    delete *iter;
                    iter = itemliste.erase(iter);
                }
                else
                    ++iter;
            }
    

    Weil erase das Element ja löscht und den iterator ungültig macht.


Anmelden zum Antworten