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 :

Opérateur d'affichage C++


Sujet :

C++

  1. #1
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut Opérateur d'affichage C++
    Bonjour,

    Voici ma portion de code:

    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
     
    public: void afficher(){
     
        cout<<"de nom "<<nom<<" datant de "<<annee<<" (provenance "<<pays<<") ayant pour valeur faciale "<<valeur_faciale<<" francs";
     
      }
     ostream& etiquette(ostream& sortie) const {
    	        sortie<<"Timbre "<<afficher();
    	        return sortie;
    }
     friend std::ostream& operator <<(std::ostream&, const Timbre&);  
    };
    std::ostream& operator <<(std::ostream& Stream, const Timbre& Obj){
        Obj.etiquette(Stream);
        return Stream; 
    }
    Ce code ne se compile pas bien sur!
    J'aimerais bien savoir comment changer la méthode "afficher()", pour qu'elle fonctionne bien ici sortie<<"Timbre "<<afficher();


    Merci d'avance pour votre aide.
    La science ne connaît qu'une loi: la contribution scientifique.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    Premièrement tu fournis à ton opérateur un paramètre qui est une méthode qui ne renvoie rien. Ton opérateur ne peut rien faire avec rien.

    Ensuite si tu veux pouvoir utiliser une autre méthode dans une méthode const, il faut que cette méthode aussi garantisse à l'autre qu'elle ne modifiera pas l'objet.

    Un petit bout de code pour illustrer. Je te laisse adapter à ton code

    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
     
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class Test
    {
        public:
     
        string afficher() const
        {
            return "bar";
        }
     
        ostream& etiquette(ostream& sortie) const
        {
            sortie << "foo" << afficher();
            return sortie;
        }
    };
     
     
    int main()
    {
        Test t;
        t.etiquette(cout);
        return 0;
    }
    Nullius in verba

  3. #3
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    D'accord. Merci bien
    Je l'ai changé comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public: string afficher() const{
     
        return ("de nom "+nom+" datant de "+annee+" (provenance "+pays+") ayant pour valeur faciale "+valeur_faciale+" francs");
      }
    J'ai eu cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    timbres.cc:38:41: erreur: no match for 'operator+' in 'std::operator+(std::basic_string<_CharT, _Traits, _Alloc>&&, const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const char*)" datant de ")) + ((const Timbre*)this)->Timbre::annee'
    Avez-vous une idée comme concaténer un string et un int ?

    Merci d'avance.
    La science ne connaît qu'une loi: la contribution scientifique.

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    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.

  5. #5
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Oui j'ai vu cette méthode .. Je dois utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <sstream>
    Alors que je dois utiliser que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <iostream>
    #include <string>
    using namespace std;
    Je ne sais pas s'il y a d'autres solutions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public: string afficher() const{
     
        return ("de nom "+nom+" datant de "+annee+" (provenance "+pays+") ayant pour valeur faciale "+valeur_faciale+" francs");
      }
    Je me suis dit que j'aurais peut être utilisé d'autre type de retour..
    La science ne connaît qu'une loi: la contribution scientifique.

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Tu peux faire ceci avec les strings :

    char* + string + char*
    string + char*
    char* + string

    Du moment que 2 char* ne se suivent pas, tu peux faire ce que tu veux, par-contre, il me semble que tu es oblige d'avoir une string en premier si tu veux concatener.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public: string afficher() const{
     
        return ("de nom "+nom+" datant de "+annee+" (provenance "+pays+") ayant pour valeur faciale "+valeur_faciale+" francs");
      }
    Donc ici, avant "de nom", tu dois avoir une string. De plus, est-ce que tu n'as que des char* et des string ? Si tu as des int ou autre ca ne fonctionnera pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public: string afficher() const{
        string tmp = "de nom ";
        return (tmp+nom+" datant de "+annee+" (provenance "+pays+") ayant pour valeur faciale "+valeur_faciale+" francs");
      }
    Pour les conversions int <-> string (ou autres), utiliser sstream est bien mais si tu n'y as pas le droit, tu peux toujours utiliser itoa et atoi.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Citation Envoyé par imperio Voir le message
    Pour les conversions int <-> string (ou autres), utiliser sstream est bien mais si tu n'y as pas le droit, tu peux toujours utiliser itoa et atoi.
    Ou revenir aux flux et faire passer celui à utiliser en paramètre de la méthode afficher().

  8. #8
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Oui, je l'ai changé comme suit:
    (une portion de mon code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ostream& afficher(ostream& strm) const {
    	  return strm <<"de nom "<<nom<<" datant de "<<annee<<" (provenance "<<pays<<") ayant pour valeur faciale "<<valeur_faciale<<" francs";
    	  }
     
     friend std::ostream& operator <<(std::ostream&, const Timbre&);  
    };
    std::ostream& operator <<(std::ostream& Stream, const Timbre& Obj){
    	cout<<"Timbre ";
        Obj.afficher(Stream);
        return Stream; 
    }
    Ma question: y a pas d'autres manières d'ajouter le mot "Timbre" sans recours à cout<< ?
    Merci d'avance.
    La science ne connaît qu'une loi: la contribution scientifique.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Attention c'est le paramètre Stream qu'il faut utiliser et non cout.

  10. #10
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Merci bien pour vos réponses
    La science ne connaît qu'une loi: la contribution scientifique.

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

Discussions similaires

  1. Question Sur l'Opérateur d'affichage C++ <<
    Par chercheur111 dans le forum C++
    Réponses: 24
    Dernier message: 19/04/2014, 21h28
  2. Opérateur d'affichage C++ <<
    Par chercheur111 dans le forum C++
    Réponses: 4
    Dernier message: 16/04/2014, 16h45
  3. Réponses: 3
    Dernier message: 11/08/2010, 09h02
  4. Réponses: 2
    Dernier message: 17/10/2009, 20h49
  5. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00

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