IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

passage de std::list à boost::ptr_list, comment remove?


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut passage de std::list à boost::ptr_list, comment remove?
    Hoy! \o

    Après avoir expérimenté des fuites de mémoires dans mon jeu, je tente de passer de mes listes de pointeur à des boost::ptr_list. La conversion se fait doucement, mais j'ai un soucis que je vais tenter d'expliquer :

    J'ai deux classe A et B. A possède une boost::ptr_list<B> et dispose de deux fonctions public qui permettent d'ajouter et retirer des B de ma liste. Ca se présente comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class A
    {
    	boost::ptr_list<B> liste;
    public:
    	void Add(B *b)
    	{
    		b->SetA(this);
    		liste.push_back(b);
    	}
     
    	void Remove(B *b)
    	{
    		???
    	}
    };
    B elle possède un pointeur vers le A qui la contiens et une fonction Calculate() appelée régulièrement. Calculate peut, sous certaines conditions, appeler le remove de A pour supprimer l'élement en question. Elle se présente comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class B
    {
    	A *my_a;
    public:
    	void SetA(A *a)
    	{
    		my_a = a;
    	}
     
    	void Calculate()
    	{
    		...
    		my_a->Remove(this);
    	}
    };
    Je n'ai pas eu de mal à changer mes std::list contre les ptr_list SAUF pour la fonction Remove().

    Avec la std::list, j'avais simplement besoin d'utiliser le pointeur de l'objet et faire un appel a liste.remove() de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void A::Remove(B *b)
    {
    	liste.remove(b);
    	delete b;
    }
    Mais depuis le passage en ptr_list, plus moyen. La fonction ptr_list::remove est a prioris private, la fonction ptr_list::erase prend un iterateur et je ne trouve pas quel fonctions utiliser pour pouvoir retirer mon élement en l'identifiant par son pointeur.

    L'idée serait de faire un boucle pour tester l'adresse de chaque élement ( par un if(&(*it) == b) ), mais j'ai un doute quand à sa fiabilité. A savoir qu'un B n'est inséré dans la liste qu'une fois par clonage via le Add(B *).

    Donc voila ma question : Comment pourrais-je supprimer mon élement en indiquant son pointeur avec la ptr_list de manière simple et fiable?
    La solution du parcours est-elle malgrés tout efficace?

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Citation Envoyé par Spidyy Voir le message
    Donc voila ma question : Comment pourrais-je supprimer mon élement en indiquant son pointeur avec la ptr_list de manière simple et fiable?
    Malheureusement, je ne crois pas qu'une telle solution existe et c'est effectivement assez frustrant.
    boost::ptr_list<T> s'efforce de masquer au maximum l'indirection du pointeur et rendre l'utilisation la plus proche possible d'une std::list<T>. C'est souvent appréciable (moins de * à taper ), sauf dans ce genre de cas où l'on voudrait justement travailler directement au niveau du pointeur.

    Reste la solution du parcours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Remove(B *b)
    {
       for(boost::ptr_list<B>::iterator it = l.begin(); it != l.end(); ++it)
       {
          if(*it.base() == b)
          {
             l.erase(it);
    	 break;
          }
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Par défaut
    Bon j'ai pas vraiment pu tester, je suis partit sur l'idée du parcours en effet, mais en le faisant, j'ai finalement changé la structure de mon jeu, ce qui fait que je n'ai plus aucun appel à mes Remove(B *) =p Dans un sens ça m'enlève une épine du pied. :]

    Merci pour ta réponse!

Discussions similaires

  1. std::list remove & delete
    Par Goundy dans le forum SL & STL
    Réponses: 1
    Dernier message: 25/12/2008, 13h06
  2. [C++][std::list] Reinterpret cast
    Par chronos dans le forum SL & STL
    Réponses: 7
    Dernier message: 18/08/2005, 17h04
  3. [dev-C++]std::list<tree_node<T>*> iterator;
    Par jmv dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/05/2005, 13h14
  4. acceder au n iéme element d'une liste std::list
    Par sorari dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/03/2005, 15h21
  5. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo