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 :

Problème de surcharge d'opérateur std::cout


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut Problème de surcharge d'opérateur std::cout
    Bonjour. Je souhaiterais afficher sur l'ecran les informations d'un objet de type Vin * v1= new Vin(string nom, string annee, string quantité).

    J'ai donc fais la surcharge de l'operateur d'injection <<, mais ça ne m'affiche que des truc bizarres en hexa, du genre 0x198f3s54.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::ostream & operator << (std::ostream & os, Vin unVin)
    {
                 os << unVin.getsonNom() <<" "<< unVin.getsonAnnee() << " " << unVin->getsaQuantite() << '\n';
     
                 return os;
     
    }
    Et voici un des accesseurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string Vin::getsonNom() const
    {
        return sonNom;
    }
    Une idée?
    Merci.

  2. #2
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Points : 158
    Points
    158
    Par défaut
    hello,

    t'as tenté de placer ton objet en référence?

    std::ostream & operator << (std::ostream & os, Vin &unVin)

    dans mon bouquin c'est défini comme ça...ca vient peut être de la!

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Idéalement, il faut même que ce soit une référence constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream& operator << (std::ostream& os, const Vin& unVin)
    Si tu as mal défini ton constructeur de copie il se pourrait que ça vienne de la.

    Au passage, si tous tes accesseurs sont définis tels que celui que tu nous as collé ce n'est pas très rapide. Il vaudrait mieux renvoyer des références constantes vers tes strings.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    hello,

    t'as tenté de placer ton objet en référence?

    std::ostream & operator << (std::ostream & os, Vin &unVin)

    dans mon bouquin c'est défini comme ça...ca vient peut être de la!
    Oui. même résultat.

    Idéalement, il faut même que ce soit une référence constante :
    Code :

    std::ostream& operator << (std::ostream& os, const Vin& unVin)

    Si tu as mal défini ton constructeur de copie il se pourrait que ça vienne de la.

    Au passage, si tous tes accesseurs sont définis tels que celui que tu nous as collé ce n'est pas très rapide. Il vaudrait mieux renvoyer des références constantes vers tes strings.
    Je vais tester avec un const alors...

    Je ne vois pas ce que tu veux dire pour les accesseurs. Oo

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Les "accesseurs", ce sont ces méthode qui renvoient une valeur propre à l'objet en cours de traitement, telle que
    getSonNom, getSonAnee, getSaQuantité...

    As tu remarqué que tu passe ton élément vin par valeur et que tu essaye d'obtenir le résultat de getSaQuantité comme s'il s'agissait d'un pointeur (il faut utiliser le . pour appeler getSaQuantité, et non le déréférencement de pointeur -> )

    Enfin, l'idéal serait peut etre de déclarer la fonction amie dans la classe vin, histoire de pouvoir te passer du recours aux accesseurs...

    Dans la classe Vin, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend std::ostream& operator<<(std::ostream&, const Vin&);
    en accessibilité publique te permet d'écrire plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ostream& operator<<(std::ostream o, const Vin& v)
    {
        o<<v.mNom<<" "<<v.mprenom<<" "<<v.mquantite;
        return o;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par Nyko17 Voir le message
    Je vais tester avec un const alors...
    Si ça ne marche pas avec une référence simple ce ne sera pas mieux avec une référence constante, le problème doit venir de l'objet que tu passes.
    Tu as essayé d'afficher le résultat de tes getxxx() simplement dans ton main ?

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Déférence tu bien ton objet ?
    Car vu ce tu nous décrit, il me semble que tu affiche plus le contenu du pointeur que l'objet pointé.
    Pour en être sûr, montre nous comment tu appelle operator<< pour ton objet.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    J'ai essayé avec const, ça ne marche pas non plus.
    Donc je me suis résigné à ne pas utiliser de pointeurs, je vais me contenter d'objets Vin simples, ça marche bien comme ça... De toutes façons, je n'avais aucune utilitée à utiliser des pointeurs, c'etait juste pour mieux comprendre leur fonctionnement. (C'est raté d'ailleurs ).
    Enfin je suis toujours ouvert pour comprendre comment l'affichage avec un pointeur.
    Pour faire simple et ne s'occuper que de ce qui nous intéresse, j'ai ça:


    Vin.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Vin
    {
      string sonNom;
      string sonAnnee;
      string saQt;
     
      public:
              Vin(std::string nom, std::string annee, std::string quantite); 
              string getNom() const;
              string getAnnee() const;
              string getQt() const;
    };
    Vin.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string Vin::getNom() const
    {
        return sonNom;
    }
    ListeVins.hpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class ListeVins
    {
     
      public:
      std::list<Vin*> sesVins;
     
    };
    ListeVins.cpp

    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
    std::ostream & operator << (std::ostream & os, Vin&  unVin)
    {
                 os << unVin.getLeNom() <<" "<< unVin.getLaAnnee() << " " << unVin.getLaQt() << '\n';
     
                 return os;
     
    }
     
    //Voici un exemple d'affichage:
     
    for(int i=0; i<nbrVin; i++)
            {
     
                  getline(uneListeVins, nom); //lecture depuis un fichier texte
                  getline(uneListeVins, date);
                  getline(uneListeVins, qt);
                  Vin* v=new Vin(nom, date, qt); // creation d'un Vin*
                  sesVins.push_back(v); //insertion dans la list
                  std::cout << v << '\n'; // CRASH
                  //toString(v); //affichage de secours (marche)
                  delete v;
                  uneListeVins.ignore();
            }

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << *v << std::endl;
    c'est mieux non ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    J'essaierai.

    Donc *v ça fait quoi, ça passe un Vin& au lieu d'un Vin* ?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par Nyko17 Voir le message
    Donc *v ça fait quoi, ça passe un Vin& au lieu d'un Vin* ?
    En gros oui.
    Ça déréférence l'objet.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    Ok, alors dernière question. Imaginons que je veuille non pas passer un Vin& mais un Vin. Est possible? Si oui comment?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 24
    Points
    24
    Par défaut
    C'est possible en déclarant ton op comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream & operator << (std::ostream & os, Vin unVin)
    et en l'appelant:
    mais c'est pas franchement conseillé...

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    Ok Ok, c'etait juste pour savoir. Bon je testerai tout ça ce soir, et je vous tiens au courant
    merci encore.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Points : 27
    Points
    27
    Par défaut
    Bon, merci ça marche, il fallait bien mettre *v.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de surcharge d'opérateur flux avec pointeur
    Par eleve_prog dans le forum Débuter
    Réponses: 4
    Dernier message: 18/04/2011, 18h41
  2. problème au surcharge d'opérateur =
    Par zougagh dans le forum C++
    Réponses: 12
    Dernier message: 28/06/2010, 17h29
  3. Réponses: 7
    Dernier message: 02/12/2007, 21h43
  4. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  5. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01

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