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

 C++ Discussion :

iterateur sur vecteur avec objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 75
    Par défaut iterateur sur vecteur avec objets
    Bonsoir

    j' ai realise un programme de test pour voir si je pouvais utiliser un iterateur sur
    un objet de type point(abcisse,ordonnee).
    Quand je fais la boucle pour afficher les elements du vecteur j ' ai un message d' erreur
    je crois comprendre que la donnee (*il) n est plus de type iterator simple donc il ne peut plus l ' afficher .
    Que dois je faire pour afficher proprement les donnees du vecteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <iostream>
    #include <vector>
    #include <utility>
    #include <iterator>
    #include <list>
     
    using namespace std;
     
    class point
    {
        int a;
        int b;
        public :
        point(int abs = 0,int ord = 0)
        {
            a = abs;b = abs;
        }
       int & operator [] (int);
       void affichep(vector<point>);  /*tentative en redefinissant []*/
     
    };
     
    int & point::operator [] (int i)
    {
        return a,b;
    }
     
    /*void point::affichep(vector<point>v)
    {
        unsigned int i;                       essai avec une fonction ne pas
        for (i=0;i<v.size();i++)              tenir compte de ce code
        cout << v[i];
    }*/
     
    main()
    {
     
        point fir(4,5);
        point sec(6,7);
        list<point>lp(7);
        //lp.push_front(fir);
        //lp.push_front(sec);
        vector<point>vp(5);
        vp.assign (lp.begin(),lp.end());
        vp.assign (3,fir);
        vector<point>::iterator il;
        for (il=vp.begin();il!=vp.end();il++)
        {
            cout << (*il) << "\n";
        }
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    *il sera de type point
    L'opérateur << existe-t-il pour ce type ?
    Essaye d'afficher (*il).a et b
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Bonjour,

    il y a de nombreuses choses à dire sur ton code.
    Commençons par ta classe Point.
    L'idée de définir un operator[] n'est pas une bonne solution ici je pense, tu pourrais le faire mais ça n'est pas d'un grand intérêt.
    Fais plutôt une classe dans le style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Point
    {
       public:
          Point(int x=0, int y=0) : m_x(x), m_y(y) {} // Cteur par défaut
     
          /* Accesseurs */
          int getX() { return m_x; }
          int getY() { return m_y; }
     
          /* Setteurs */
          void setX(int x) { m_x=x; }
          void setY(int y) { m_y=y; }
     
          /* Ici tu pourrais si tu le souhaites définir l'opérateur << au lieu de faire une fonction membre affiche */
          void affiche() { std::cout << "Point(" << x << ";" << y << ")\n"; }
     
       private:
          int m_x;
          int m_y;
    };
    Ensuite, faire une fonction membre affichep(...) dans ta classe point n'est pas très logique. Appeler une fonction sur un objet qui prendrait un vecteur de points en paramètres pour les afficher. Quel rôle particulier joue ton point pour qu'elle mérite d'être appelée sur un point précis?
    Ce membre n'ayant pas besoin de connaitre comment est faite la représentation d'un Point (à savoir 2 int), elle n'a pas à être membre.
    Tu peux donc définir ta fonction comme une fonction extérieure à la classe Point avec ce prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichePoints(std::vector<Point>& v);
    Evites de passer des objets par valeur. Si ton vecteur avait compris 3000000 de Point, il aurait fallu tous les copier!

    Ensuite la méthode pour parcourir un vecteur de ce type est simple.
    Tu déclares et définis un iterator comme tu l'as fait, tu peux même prendre un const_iterator vu que tu ne modifieras pas l'objet "pointé" par l'itérateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::vector<Point> v;
    v.push_back(Point(2,5));
    v.push_back(Point(-8,3));
    ... /* tu continues tes insertions */
     
    typedef std::vector<Point>::const_iterator IP;
    for(IP it=v.begin(); it!=v.end(); ++it)
       (*it).affiche();  // ou it->affiche()
    En fait un iterateur n'est pas un pointeur, il se comporte comme tel car son implémentation est bien sur faite à partir d'un pointeur.
    Ici, tu obtiens des iterateurs sur des Points. Quand tu fais l'indirection sur ton iterateur en faisant (*it) tu as donc un objet Point comme tu as dit, tu peux donc lui appliquer la fonction membre affiche() : (*it).affiche()

    Maintenant si effectivement tu n'aimes pas affiche(), et que tu souhaites réellement obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout << *it << "\n";
    pour afficher tes points, il faut redéfinir l'operateur << à l'extérieur de ta classe Point par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::ostream& operator<<(std::ostream& os, Point& p)
    {
          os << "Point("+p.getX()+";"+p.getY()+")\n";
          return os;
    }
    P.S. : pense à mettre une majuscule à la première lettre de tes classes.

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Citation Envoyé par Xtrem_Voyageur Voir le message
    P.S. : pense à mettre une majuscule à la première lettre de tes classes.
    Et en quel honneur ?

    Il est vrai qu'en Java il fortement conseillé de faire commencer le nom des classes par une majuscule (je n'ai jamais essayé de faire autrement, alors je ne sais pas si ça compile quand on met une minuscule...), mais à ma connaissance il n'y a pas de telle recommandation en C++.
    D'ailleurs, toutes les classes de la bibliothèque standard commencent par une minuscule.
    Celles de boost également, d'après ce que j'ai pu voir...

  5. #5
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Bonjour Stephane,

    En effet, mettre des majuscules au nom de type définis par l'utilisateur, les classes donc n'est pas obligatoire, toutefois c'est conseillé car cela est d'une grande aide visuelle, d'ailleurs en te lisant, tu pourrais comprendre pourquoi.

    Tu dis
    D'ailleurs, toutes les classes de la bibliothèque standard commencent par une minuscule.
    Celles de boost également, d'après ce que j'ai pu voir...
    L'aide que cela apporte est de permettre de savoir si un type qu'on utilise est un type défini par l'utilisateur et non un type de la bibliothèque standard ou de boost ou encore un autre nom non typé.

    D'ailleurs si tu lis le Stroustrup, ou encore Effective C++, tu remarqueras que les auteurs ont pris soin de toujours mettre une majuscule à leur nom de classe.

    Cordialement

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    À vrai dire, ce n'est pas pour moi que je posais la question.
    Quoique je voulais tout de même m'assurer de tes raisons.

    Indiquer à quelqu'un de faire quelque chose qui est considéré comme une bonne pratique, c'est bien ; lui dire pourquoi, c'est mieux.

    Si j'ai pris l'exemple de la bibliothèque standard et de boost, c'était avant tout pour pointer le fait que ce n'est pas obligatoire.
    Par contre, pour le Stroustrup et Effective C++, ça indique juste que les auteurs ont pris comme convention de commencer les noms de classe par une majuscule.

    Encore une fois, je ne critique pas cette convention d'écriture (loin de là), je voulais juste t'en faire expliciter les raisons.
    (Et indiquer que ce n'est pas une recommandation du langage... )

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Xtrem_Voyageur Voir le message
    L'aide que cela apporte est de permettre de savoir si un type qu'on utilise est un type défini par l'utilisateur et non un type de la bibliothèque standard ou de boost ou encore un autre nom non typé.
    Il y a les espaces de nom, pour faire ces distinctions.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Bonjour.

    Et en quel honneur ?

    Il est vrai qu'en Java il fortement conseillé de faire commencer le nom des classes par une majuscule (je n'ai jamais essayé de faire autrement, alors je ne sais pas si ça compile quand on met une minuscule...), mais à ma connaissance il n'y a pas de telle recommandation en C++.
    On peut même mettre des caractères accentués dans les noms de classe.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2015, 17h19
  2. Formation avec PPT sur DVD avec objet flash et WMP
    Par Mich92c dans le forum Powerpoint
    Réponses: 5
    Dernier message: 16/10/2009, 11h16
  3. Formation avec PPT sur CD avec objet flash et WMP
    Par Mich92c dans le forum Powerpoint
    Réponses: 0
    Dernier message: 13/10/2009, 16h37
  4. Réponses: 10
    Dernier message: 22/09/2008, 10h23
  5. Problème Iterateur sur liste d'objets
    Par kornterstrike dans le forum SL & STL
    Réponses: 1
    Dernier message: 23/11/2007, 19h33

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