GNT sans publicité, site mobile, fonctionnalitées exclusives...

STL et itérateurs

Le
Hamiral
Bonjour,

Je me suis remis très récemment au C++, et je me trouve avec un problème
d'itérateur que je n'arrive pas à résoudre. Il me semblait que ce serait
plutôt trivial, il s'agit de parcourir une std::list avec un itérateur,
dans une fonction operator=.
Le problème est le suivant : j'ai une classe Level et une classe Ball.
La classe Level contient la déclaration suivante (en protected) :
std::list<Ball> mBalls;

et voici mon operator= :
Level& Level::operator=(const Level & level) {
mBalls.clear();

std::list<Ball>::iterator iter;
for (iter = level.mBalls.begin(); iter != level.mBalls.end();
++iter) {
mBalls.push_back(*iter);
}
}

Je pensais que c'était comme cela qu'on utilise les itérateurs, mais le
compilateur me sort systématiquement l'erreur suivante :

level.cpp: Dans member function « Level& Level::operator=(const Level&) »:
level.cpp:7: error: no match for 'operator=' in 'iter = std::list<_Tp,
_Alloc>::begin() const [with _Tp = Ball, _Alloc =
std::allocator<Ball>]()'
/usr/include/c++/3.3/bits/stl_list.h:145: error: candidates are:
std::_List_iterator<Ball, Ball&, Ball*>& std::_List_iterator<Ball, Ball&,
Ball*>::operator=(const std::_List_iterator<Ball, Ball&, Ball*>&)


Je n'y comprends rien et ce malgré toute les recherches que j'ai pu
faire sur le net

Merci d'avance pour votre aide.

--
Hamiral
Lire les 11 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Hamiral
Le #269040
level.cpp: Dans member function « Level& Level::operator=(const Level&) »:
level.cpp:7: error: no match for 'operator=' in 'iter = std::list<_Tp,
_Alloc>::begin() const [with _Tp = Ball, _Alloc > std::allocator<Ball>]()'
/usr/include/c++/3.3/bits/stl_list.h:145: error: candidates are:
std::_List_iterator<Ball, Ball&, Ball*>& std::_List_iterator<Ball, Ball&,
Ball*>::operator=(const std::_List_iterator<Ball, Ball&, Ball*>&)



J'ai oublié de préciser que la ligne 7 correspond à la ligne du for.
Merci encore.

loic.actarus.joly
Le #269038

Level& Level::operator=(const Level & level) {
mBalls.clear();

std::list<Ball>::iterator iter;
for (iter = level.mBalls.begin(); iter != level.mBalls.end();
++iter) {
mBalls.push_back(*iter);
}
}


Pour itérer sur un conteneur constant, il te faut un const_iterator.

--
Loïc

Falk Tannhäuser
Le #269037
Hamiral wrote:
Le problème est le suivant : j'ai une classe Level et une classe Ball.
La classe Level contient la déclaration suivante (en protected) :
std::list<Ball> mBalls;

et voici mon operator= :
Level& Level::operator=(const Level & level) {
mBalls.clear();

std::list<Ball>::iterator iter;
for (iter = level.mBalls.begin(); iter != level.mBalls.end();
++iter) {
mBalls.push_back(*iter);
}
}


Pourquoi pas tout simplement

Level& Level::operator=(Level const& level)
{
mBalls = level.mBalls;
return *this;
}

?

Falk

Manuel Zaccaria
Le #269036
"Hamiral" a écrit:
Bonjour,



Bonjour,

Je me suis remis très récemment au C++, et je me trouve avec un problème
d'itérateur que je n'arrive pas à résoudre. Il me semblait que ce serait
plutôt trivial, il s'agit de parcourir une std::list avec un itérateur,
dans une fonction operator=.
Le problème est le suivant : j'ai une classe Level et une classe Ball.
La classe Level contient la déclaration suivante (en protected) :
std::list<Ball> mBalls;

et voici mon operator= :
Level& Level::operator=(const Level & level) {
mBalls.clear();

std::list<Ball>::iterator iter;
for (iter = level.mBalls.begin(); iter != level.mBalls.end();
++iter) {
mBalls.push_back(*iter);
}
}


Pour commencer, tous les conteneurs de la bibliothèque standard sans
exception ont une sémantique objet, c'est-à-dire qu'ils supportent
directement la copie (par opposition à un pointeur nu par exemple).

Au lieu de copier toute la liste à la main, on pourrait faire:

Level& Level::operator=(const Level & level) {
mBalls = level.mBalls;
}

Mais si mBalls est le seul membre donnée de la classe Level, ou plus
généralement si il n'y a que des membres qui sont copiables, il est
recommandé de laisser le compilateur générer le constructeur de copie
et l'opérateur d'affectation et de ne pas s'en soucier.

Grosso modo. J'espère que j'ai pas écris des conneries.

...


Cordialement,
Manuel

Hamiral
Le #269035


Level& Level::operator=(const Level & level) {
mBalls.clear();

std::list<Ball>::iterator iter;
for (iter = level.mBalls.begin(); iter != level.mBalls.end();
++iter) {
mBalls.push_back(*iter);
}
}



Pour itérer sur un conteneur constant, il te faut un const_iterator.



Merci ! Mais comment est-ce que je fais pour savoir dans quel cas je me
trouve ?


Publicité
Suivre les réponses
Poster une réponse
Anonyme