IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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.

 
Sélectionnez
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.

 
Sélectionnez
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

Créé le 1er janvier 2018  par Winjerome

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2021 Winjerome. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.