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
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

Poser une question


J'ai oublié de préciser que la ligne 7 correspond à la ligne du for.
Merci encore.
Pour itérer sur un conteneur constant, il te faut un const_iterator.
--
Loïc
Pourquoi pas tout simplement
Level& Level::operator=(Level const& level)
{
mBalls = level.mBalls;
return *this;
}
?
Falk
Bonjour,
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
Merci ! Mais comment est-ce que je fais pour savoir dans quel cas je me
trouve ?