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