Liberer un emplaceemnt dans une "list" en c++ sans supprimer l'objet
timy94
Messages postés50Date d'inscriptionjeudi 17 novembre 2005StatutMembreDernière intervention 7 janvier 2009
-
20 août 2008 à 14:04
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 2012
-
23 août 2008 à 11:16
Bonjour
Voici mon code
CEvenement & MyClasse::Get_Evt()
{
list <CEvenement *>::iterator pEvt;
list <Cevenement *>::iterator pListEvt = m_Liste_Evt.begin();
l'appel à cette methode est
CEvenement & evenement = Ref.MyClasse.Get_Evt();
Ce que je veux faire.
J'ai une liste d'itérator qui pointent vers des Objets de type "Classe d'Evenement".
Je veux que la methode Get_Evt renvoi l'adresse de l'objet "Classe d'Evenement", retire de la liste l'iterator, mais ne touche pas à l'objet concerné puisque l'objet est utilisé par une autre classe.
En fait c'a à l'air de marcher mais de temps en temps ca plante et je ne comprends pas pourquoi. le retour de la methode Get_Evt() me revoit sur n'import quoi.
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 20122 20 août 2008 à 18:26
Quand ta liste est vide, tu retournes l'objet référencé par m_liste_Evt.begin() qui vaut alors m_liste_Evt.end() ; or, par définition, m_liste_Evt.end() ne pointe sur aucun élément valide. Donc, tu obtiens n'importe quoi.
timy94
Messages postés50Date d'inscriptionjeudi 17 novembre 2005StatutMembreDernière intervention 7 janvier 2009 23 août 2008 à 08:57
Bonjour
Certe m_liste_Evt.begin() est vide, mais avant de le detruire j'ai passé un référence à l'iterator pEvt. Et, c'est cet iterator que je passe.
Alors comment faire pour conserver la place memoire de l'objet intact pour une utilisation ulterieure par une reférence sur cet l'objet et ne supprimer que le lien sur la liste.
En clair je veux vider la liste mas pas supprimer les objet.
cs_Lucky92
Messages postés180Date d'inscriptionmercredi 22 décembre 2004StatutMembreDernière intervention16 août 20122 23 août 2008 à 11:16
C'est déjà le cas, erase() ne détruit pas les objets, il retire simplement les pointeurs de la liste.
En fait, ta méthode fonctionne correctement tant que la liste n'est pas vide. Mais dés que la liste est vide, tu n'as plus d'objet consistant à renvoyer, et tu renvoies le 'end' de ta liste ; or avec les itérateurs, le 'end' pointe après le dernier objet valide. Donc, lorsque tu appelles ta fonction alors que la liste est vide, la référence retournée est bidon et/ou ton application plante...
Voici quelques solutions possibles :
1/ tu remplaces les références par des pointeurs, et lorsque la liste est vide tu retournes un pointeur nul pour que l'appellant puisse tester la validité. ( Il n'y a de notion de référence nul en c++ !).
2/ tu crées dans ta classe une méthode qui permet à l'appellant de savoir si la liste est vide.
3/ losrque la liste est vide, tu lances une exception que l'appellant puisse catcher.
2 petites remarques :
pour tester si une liste est vide, la méthode empty() est plus élégante.
pour récupérer le premier ( resp. le dernier ) élément d'une liste non vide, utilises front() ( resp. back() ).
pour supprimer le premier ( resp. le dernier ) élément d'une liste non vide, utilises pop_front() ( resp. pop_back() ).
Ton code devient alors :
CEvenement & MyClasse::Get_Evt()
{
if ( m_Liste_Evt.empty() ) throw;