FAQ C++ moderne et erreurs courantes

Ce ou ces sujets font partie d'une FAQ en cours d'écriture, vos retours sont les bienvenus.
Vous avez la possibilité de parcourir à l'aide d'une boucle for-range les éléments des différents conteneurs (std::string, std::vector…) de la STL, mais vous avez également la possibilité de parcourir les éléments encapsulés par vos propres classes, que ce soit ces mêmes conteneurs ou vos propres collections (vous devrez dans ce dernier cas également coder votre propre itérateur).
Il vous suffit pour cela de fournir les fonctions begin() et end(), retournant respectivement l'itérateur sur le premier et post-dernier élément. Celles-ci peuvent prendre deux formes :
Fonctions membres
Les fonctions membres publiques qui ne prennent aucun paramètre. Vous pouvez selon vos besoins coder deux surcharges :
- non constante, la fonction n'est pas qualifiée de
const
et retourne un iterator qui permet la modification. Elle sera appelée par une instance non constante ; - constante, la fonction est qualifiée de
const
et retourne un const_iterator qui permet la lecture seule. Elle sera appelée par une instance constante.
Par respect pour l'encapsulation, on préférera généralement seulement fournir la version constante qui interdira la modification des éléments depuis l'extérieur.
class
MaClasse {
public
:
// Version constante
const_iterator begin() const
{
return
… ; }
const_iterator end() const
{
return
… ; }
// Version non constante
iterator begin() {
return
… ; }
iterator end() {
return
… ; }
}
;
Fonctions libres
Les fonctions libres, elles, prennent en paramètre l'instance de la classe. Selon le même principe, vous pouvez avoir deux surcharges constante et non constante.
class
MaClasse {
… }
;
// Version constante
const_iterator begin(MaClasse const
&
) {
return
… ; }
const_iterator end(MaClasse const
&
) {
return
… ; }
// Version non constante
iterator begin(MaClasse &
) {
return
… ; }
iterator end(MaClasse &
) {
return
… ; }
Cette seconde méthode vous permet en particulier d'étendre cette possibilité de parcours sur des classes déjà existantes sans pour autant modifier leur code.
Afin de pouvoir être visibles par l'ADL, celles-ci doivent se situer dans le même namespace que la classe.
À voir également