2012-12-02 6 views
1

Je retenais des objets dans la liste, comme celle-ci:Suppression d'un pointeur d'objet de maintien de la liste

list<CWorm*> wormList; 

je mets les vers sur cette liste, dans leur constructeur:

CWorm::CWorm(list<CWorm*>& list, [...]) { 
    list.push_back(this); 

dans la boucle principale, je joue quelques événements pour eux, avec ceci:

for(itt = wormList.begin(); itt != wormList.end(); itt++) { 
    if((*itt) != NULL) (*itt)->someEventBlabla(); 
} 

va Voici ma question: Ho w puis-je les supprimer d'une liste de manière efficace. Quand ils meurent, j'ai essayé de les "effacer" de la liste (dans la boucle principale, après vérification des variables) mais cela donnait des erreurs d'itérateur non référencé. Et lorsque je tente de « supprimer » les dans une liste (en objets, en cas réalisée par la boucle principale), il y a alors un ARROR dans cette ligne:

if((*itt) != NULL) (*itt)->someEventBlabla(); 

J'ai essayé de les enlever comme ça :

wormList.remove(this) 

à partir d'un événement d'objet, avec wormList déclaré comme externe.
Comment puis-je les supprimer en laissant un espace vide pour l'objet suivant ??

+0

S'il vous plaît montrer au code que vous avez essayé d'utiliser pour supprimer les éléments afin que les gens peuvent vous dire comment le corriger. – Mat

+0

Cette conception est outrageusement terrible. Les pointeurs n'ont aucune notion de propriété, et même votre propre code n'a aucun moyen de connaître la durée de vie de ces objets 'CWorm'. C'est à juste titre, car un objet ne devrait pas être concerné par qui le possède. Mais le résultat est tout simplement de ne pas utiliser de pointeurs nus du tout. –

+0

J'ai essayé de les supprimer comme ceci: wormList.remove (this) à partir d'un événement d'objet, avec wormList déclaré comme extern. Répondre à ce commentaire: "Ce design est outrageusement terrible ..." Je sais. Je fais juste un projet C++, et c'est la première fois que je fais quelque chose de "plus grand" :) – Saus

Répondre

0

Eh bien, probablement, vous devriez travailler avec un certain type de pointeurs intelligents ici. Mais généralement vous voulez faire quelque chose comme ça

using namespace std; 
    wormList.erase(remove_if(wormList.begin(), wormList.end(), bind1st(equal_to<CWorm*>(), NULL)), wormList.end()); 
Questions connexes