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

SL & STL C++ Discussion :

Iterator sur list et fonction const


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut Iterator sur list et fonction const
    Bonjour,

    J'ai réalisé une classe BddPersonnes qui hérite en private d'une list<Personne*> où Personne est une classe abstraite.
    Cette classe BddPersonnes contient 2 méthodes que j'aimerais pouvoir passer en const: affiche() et statistiques().

    La classe BddPersonnes:
    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
    17
    18
    19
     
    class BddPersonnes : private list<Personne*>
    {
    	private:
    		list<Personne*>::iterator _it;
     
    	public:
    		BddPersonnes();
    		BddPersonnes(const BddPersonnes&);
    		~BddPersonnes();
    		BddPersonnes& operator =(const BddPersonnes&);
     
    		void ajouter(Personne* const);
    		void ajouter(int, Personne* const);
    		void supprimer(Personne* const);
    		void supprimer(int);
    		void statistiques();
    		void affiche();
    };
    Les 2 méthodes concernées:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void BddPersonnes::statistiques()
    {
    	int countEtudiant = 0;
    	int countEnseignant = 0;
    	int countAdministratif = 0;
     
    	for(_it = begin(); _it != end(); ++_it)
    	{
    		if((*_it)->qualite() == "Etudiant")
    			++countEtudiant;
    		else if((*_it)->qualite() == "Enseignant")
    			++countEnseignant;
    		else if((*_it)->qualite() == "Administratif")
    			++countAdministratif;
    	}
     
    	cout << "Il y a " << countEtudiant << " étudiants, " << countEnseignant <<   " enseignants et " << countAdministratif << " membres d'administration dans la base de 				données." << endl;
    }  
     
    void BddPersonnes::affiche()
    {
    	for(_it = begin(); _it != end(); ++_it)
    	{	
    		(*_it)->affiche();
    	}
    }
    La méthode qualite() est virtual pure dans Personne et la méthode affiche() est virtual.
    Les classes Étudiant, Enseignant et Administratif héritent de Personne et redéfinissent correctement les méthodes nécessaires.

    Le problème est le suivant: Lorsque je passe affiche() et statistiques() en const dans BddPersonnes, g++ renvoi une erreur sur les opérateurs = et ++ pour _it. J'ai bien essayé de passer par un const_iterator pour ces 2 méthodes mais il y a toujours une erreur de compilation.

    Voici l'erreur de compilation:
    BddPersonnes.cc: In member function «void BddPersonnes::affiche() const":
    BddPersonnes.cc:74: erreur: no match for «operator=" in «((const BddPersonnes*)this)->BddPersonnes::_it = ((const BddPersonnes*)this)->BddPersonnes::<anonymous>.std::list<_Tp, _Alloc>::begin [with _Tp = Personne*, _Alloc = std::allocator<Personne*>]()"
    /usr/include/c++/4.1.3/bits/stl_list.h:112: note: candidats sont: std::_List_iterator<Personne*>& std::_List_iterator<Personne*>::operator=(const std::_List_iterator<Personne*>&)
    BddPersonnes.cc:74: erreur: passing «const std::_List_iterator<Personne*>" as «this" argument of «std::_List_iterator<_Tp>& std::_List_iterator<_Tp>::operator++() [with _Tp = Personne*]" discards qualifiers

    En fait ce que je ne comprend pas trop c'est les candidats pour =

    Merci d'avance si vous pouvez m'éclairer

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Utilise des variables locales plutôt que ce _it :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for( list<Personne*>::iterator it = begin(); it != end(); ++it )
      ...
    Sinon il vaut mieux aggréger plutôt que de dériver quand on peut, surtout pour les conteneurs STL : crée une donnée membre pour ta liste au lieu d'en dériver.

    MAT.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut
    J'ai remplacé mon _it par des var locales et ça marche en effet (en passant par des const_iterator pour les méthodes const).
    C'est vrai que maintenant ça parait logique que = et ++ posaient problème sur un iterator déclaré comme membre de class !

    Concernant la composition, j'étais parti la dessus aussi au départ, mais le schéma d'héritage du sujet imposait un héritage privé entre BddPersonnes et list.

    Merci beaucoup pour ta solution

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

Discussions similaires

  1. [Fonction]tri sur liste déroulante
    Par maxeur dans le forum IHM
    Réponses: 8
    Dernier message: 16/04/2007, 10h00
  2. Réponses: 2
    Dernier message: 11/10/2006, 21h11
  3. Itération sur une liste d'éléments
    Par anitshka dans le forum Prolog
    Réponses: 3
    Dernier message: 05/07/2006, 22h49
  4. fonction rand() sur liste ?
    Par debutant-1 dans le forum C
    Réponses: 10
    Dernier message: 24/05/2006, 10h58
  5. liste énumérée de const. perso comme paramètre de fonction
    Par batou22003 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/12/2005, 20h37

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