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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

(STL) Accéder aux fonctions d'une classe via un itérateur ?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 2
    Par défaut (STL) Accéder aux fonctions d'une classe via un itérateur ?
    bonjour,

    voilà je cherche à convertir un bout de code en respectant le style c++, utilisant des vector/itérateur et je bloque sur l'utilisation des itérateurs.

    J'ai une classe Groupe qui contient une collection de Personne.
    La classe Personne contient une fonction afficherNom().

    Voilà le code que je souhaite modifier et qui m'affiche le nom de toutes les personnes du groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i = 0 ; i < groupe.nbPersonnes ; i++)
        groupe.lesPersonnes[i].afficherNom();
    Ca fonctionne très bien mais ressemble trop à du C. En introduisant des vectors, le code devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i = 0 ; i < groupe.nbPersonnes ; i++)
        groupe.vectlesPersonnes.at(i)->afficher();
    Ca marche bien mais maintenant je veux utiliser un itérateur et c'est là que ça coince. Il faudrait une truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(itlesPersonnes=groupe.vectlesPersonnes.begin();itlesPersonnes!=groupe.vectlesPersonnes.end();itlesPersonnes++)
        *itlesPersonnes->afficher();
    J'ai essayé toutes sortes de choses mais rien ne va. Une idée ?

  2. #2
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    salut

    T'as pas precisé si tu utilisais le vecteur de STL ou non !!! Si moui il ya des pros de STL sur le forum qui vont surement te repondre ( coucou LouLou24 !! )

    Si tu veux creer ta propre liste avec son iterateur je vais te donner un peu l'idée mais je n'ai pas pour l'instant un code à te donner . Mais j'envisage de l'implementer.

    L'iterateur doit prendre la liste sur laquelle il va iterer dans la construction
    La liste doit avoir elle aussi une liste d'iterateurs qui sont entrain d'iterer sur elle ( il le faut pour les iterations imbriquées)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterateur(Liste * L){L->AjouterMoi(this);}
    Il faut faire aussi attention quand on va supprimer un element d'avancer un iterateur qui pointe sur l'objet à supprimer

    Et dans le destructeur de iterateur enlever l'interateur detruit de la liste d'iterateur de la liste surlaquelle il opere

    En gros c'est ca il reste juste l'implementation

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 2
    Par défaut
    T'as pas precisé si tu utilisais le vecteur de STL ou non !!!
    ha oui pardon, j'utilise effectivement les vecteurs de la STL (modif du titre en conséquence).


    La liste doit avoir elle aussi une liste d'iterateurs qui sont entrain d'iterer sur elle
    hum je suis pas sûr d'avoir saisi mais il est un peu tard là, je potasserai ça demain.

    Merci pour ta réponse.

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut Re: (STL) Accéder aux fonctions d'une classe via un itérateu
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // version 1
    for (int i = 0 ; i < groupe.nbPersonnes ; i++)
        groupe.lesPersonnes[i].afficherNom();
    ici j'imagine que lesPersonnes est un Personne * ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // version 2
    for (int i = 0 ; i < groupe.vectLesPersonnes.size() ; i++)
        groupe.vectLesPersonnes[i]->afficher();
    si vectLesPersonnes est un std::vector<Personne>, alors autant utiliser la fonction size() pour en connaitre la taille. ainsi l'attribut nbPersonne n'a plus lieu d'etre. ça évite d'avoir à gérer cette variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // version 3
    typedef std::vector<Personne>::const_iterator iterPers;
    iterPers debut = groupe.vectlesPersonnes.begin();
    iterPers fin = groupe.vectlesPersonnes.end();
     
    for(iterPers it = debut ; it != fin ; it++)
        *it->afficher();
    ne pas hésiter à écrire plusieurs lignes et à introduire des variables. ça facilite la lecture.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est un vecteur de Personne et Personne* ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    it->afficher(); // 1er cas
    (*it)->afficher(); // 2nd cas
    Mais tu peux faire encore mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // v = groupe.vectlesPersonnes // c'est plus court
    std::for_each(v.begin(), v.end(), std::mem_fun(&Personne::afficherNom));

Discussions similaires

  1. Accéder au trait d'une classe via son instance
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 15/04/2012, 20h47
  2. Accéder aux méthodes d'une classe
    Par doubiste_59 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 28/07/2010, 16h09
  3. Réponses: 3
    Dernier message: 29/03/2010, 17h01
  4. Accéder aux composants d'une class depuis une autre class
    Par CaRadek dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 10/03/2010, 21h37
  5. Réponses: 5
    Dernier message: 23/04/2007, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo