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;
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
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;
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;
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;
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;
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:
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" 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;
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:
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.
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;
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:
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.
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ...
J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour
des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.
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 ?
level est const (cf le mot clé const dans const Level& level). Par conséquent tous les membres non "mutable" de level sont accessible de façon constante uniquement. C'est le cas de mBalls. Donc level.mBalls est un objet constant et la méthode level.mBalls.begin retourne un const_iterator (qu'on ne peut pas caster en iterator)
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 ?
level est const (cf le mot clé const dans const Level& level). Par
conséquent tous les membres non "mutable" de level sont accessible de façon
constante uniquement. C'est le cas de mBalls. Donc level.mBalls est un objet
constant et la méthode level.mBalls.begin retourne un const_iterator (qu'on
ne peut pas caster en iterator)
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 ?
level est const (cf le mot clé const dans const Level& level). Par conséquent tous les membres non "mutable" de level sont accessible de façon constante uniquement. C'est le cas de mBalls. Donc level.mBalls est un objet constant et la méthode level.mBalls.begin retourne un const_iterator (qu'on ne peut pas caster en iterator)
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 ?
Qu'importe. Si tu ne veux rien modifier, utilise un const_iterator. Si l'objet n'est pas const, l'iterator que renvoie begin() et end() se convertit implicitement en const_iterator. (Si tu veux modifier quelque chose, évidemment, tu utilises iterator. Si la collection est const, et que tu n'as pas droit de la modifier, le compilateur te le dira.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
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 ?
Qu'importe. Si tu ne veux rien modifier, utilise un
const_iterator. Si l'objet n'est pas const, l'iterator que
renvoie begin() et end() se convertit implicitement en
const_iterator. (Si tu veux modifier quelque chose, évidemment,
tu utilises iterator. Si la collection est const, et que tu n'as
pas droit de la modifier, le compilateur te le dira.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
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 ?
Qu'importe. Si tu ne veux rien modifier, utilise un const_iterator. Si l'objet n'est pas const, l'iterator que renvoie begin() et end() se convertit implicitement en const_iterator. (Si tu veux modifier quelque chose, évidemment, tu utilises iterator. Si la collection est const, et que tu n'as pas droit de la modifier, le compilateur te le dira.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ...
J'avoue que je me suis un peu acharné sur les itérateurs
/aussi/ pour des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Falk Tannhäuser
kanze wrote:
Hamiral wrote:
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ...
J'avoue que je me suis un peu acharné sur les itérateurs
/aussi/ pour des raisons d'apprentissage.
Effectivement je ne me doutais pas de cette possibilité ... J'avoue que je me suis un peu acharné sur les itérateurs /aussi/ pour des raisons d'apprentissage.