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

 C++ Discussion :

Encapsuler une list dans une class


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut Encapsuler une list dans une class
    Bonjour,

    J'ai une class A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
    	public:
    		const std::list<B> &getList() const{return list;}
    		void removeElementFromList(std::list<B>::const_iterator it){/*???*/};
     
    	private:
    		std::list<B> list;
    };
    Grace à la méthode getList(), je peux parcourir la liste private 'list' à l'aide d'un const_iterator.
    Ma question: comment supprimer un élement de cette liste à partir d'un const_iterator à l'aide de la méthode removeElementFromList?

    Biensur, je ne veux pas qu'il soit possible de supprimer un élément de la liste en dehors de ma class 'A'.

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    Tu as essayé la fonction list::erase ? Ça devrait marcher.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void A::removeElementFromList(std::list<B>::const_iterator it)
    {
        list.erase(it);
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Je viens de tester et ça ne fonctionne pas.
    J'ai le droit à cette erreur: 'no matching function for call....'

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Par défaut
    Il faudrait un peu plus de détails sur l'erreur générée. Quelle fonction n'est pas trouvée ?

    Car la solution proposée par zenux est correcte. Je pense que tu dois avoir fait une petite erreur de frappe quelque part ou alors ça vient d'une autre partie de ton code

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Je le verrai bien venir d'un
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    list<B> l = a.getList()
    list<b>::const_iterator w = list.find(42); // l'erreur étant ici: la liste est copiée.
    a.removeElementFromList(w);
    Bref, tu ne devrais pas exposer ta liste, mais plutôt fournir les fonctions de recherche qui ont du sens histoire de garder de la cohérence.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Merci pour vos réponses. Voici mon code source en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <list>
    class A{
    	public:
    		void removeElementFromList(std::list<int>::const_iterator it)
    		{
    			list.erase(it);
    		}
    	private:
    		std::list<int> list;
    };
     
    int main(){
    	return 0;
    }
    Compilé avec g++:
    greg@greg-laptop:/home/greg$ g++ test.cpp
    test.cpp: In member function ‘void A::removeElementFromList(std::_List_const_iterator<int>)’:
    test.cpp:7: error: no matching function for call to ‘std::list<int, std::allocator<int> >::erase(std::_List_const_iterator<int>&)’
    /usr/include/c++/4.4/bits/list.tcc:107: note: candidates are: std::_List_iterator<_Tp> std::list<_Tp, _Alloc>::erase(std::_List_iterator<_Tp>) [with _Tp = int, _Alloc = std::allocator<int>]
    /usr/include/c++/4.4/bits/stl_list.h:1092: note: std::_List_iterator<_Tp> std::list<_Tp, _Alloc>::erase(std::_List_iterator<_Tp>, std::_List_iterator<_Tp>) [with _Tp = int, _Alloc = std::allocator<int>]
    La fonction erase avec un const_iterator n'existe pas d'après http://www.cplusplus.com/reference/stl/list/erase/ .

    Bref, tu ne devrais pas exposer ta liste, mais plutôt fournir les fonctions de recherche qui ont du sens histoire de garder de la cohérence.
    En effet, c'est pas top comme solution mais je ne vois pas de bonne solution pour ce que je veux faire. En fait, ma classe qui contient la liste est une forme geométrique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class FormeGeometrique{
    public:
    // methodes...
    private:
    std::list<Triangle> triangles;
    }
    Ensuite, j'ai plusieurs algorithmes qui peuvent modifier cette forme géométrique. Pour que ces algos puissent fonctionner correctement, j'ai besoin de leur fournir la liste des triangles et la possiblitée d'ajouter ou supprimer des triangles. Comment faire ça proprement ?

    Merci d'avance.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Par défaut
    Citation Envoyé par zenux Voir le message
    La fonction erase avec un const_iterator n'existe pas d'après http://www.cplusplus.com/reference/stl/list/erase/ .
    Pour altérer le contenu de la list, il faut utiliser un iterator et non const_iterator.

    Avec un const_iterator, tu ne peux pas modifier le container (ajout/suppression) ni modifier le contenu de l'un de ses éléments. C'est pour cela qu'il n'existe aps de méthode erase prenant un const_iterator.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une liste dans une liste?
    Par JerryOne3 dans le forum C#
    Réponses: 11
    Dernier message: 11/01/2009, 16h43
  2. quand je selectionne une valeur dans une liste, retourne une autre valeur
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/12/2008, 14h23
  3. [débutant] Comment gérer une liste dans une liste
    Par Lenoiche dans le forum iReport
    Réponses: 0
    Dernier message: 16/07/2008, 10h41
  4. champ d'une liste lié à une liste dans un autre site
    Par guintolli dans le forum SharePoint
    Réponses: 8
    Dernier message: 08/07/2008, 14h51
  5. Appel d'une liste dans une liste (JSTL)
    Par abalgue dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/06/2007, 10h56

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