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 :

réaliser: maFonctionDaffichage << "chaine" << 2 << endl


Sujet :

C++

  1. #1
    Membre régulier Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Points : 86
    Points
    86
    Par défaut réaliser: maFonctionDaffichage << "chaine" << 2 << endl
    Bonsoir,

    Je débute en C++ et j'ai beau me battre des heures et parcourir le oueb, rien n'y fait.
    En gros, je veux une sorte de std::cout personnalisé qui m'affiche tout non pas sur la stdout mais dans un endroit à moi ( en l'occurrence une Textview de gtk ).
    Par exemple, je veux pouvoir faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonction << "je" << "suis " << 1 << " chaine" << endl;
    Mais je ne m'en sort pas.
    La seule chose que je suis arrivé a faire c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MaClass {
          /* ...  */
          template<typename T> void operator <<(const T& stuff);
    }
     
    /*  ...  */
     
    template<typename T>
    void MaClasse::operator <<(const T& stuff){
        cout << "Test: " << stuff << endl;
    }
    /* ...  */
    MaClasse obj;
    qui me permet de faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj << "plop"; // ou meme:
    obj << 2;
    Mais pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj << "plop" << "autre plop";
    auquel cas g++ me dit que je n'ignore pas le void comme je le devrai. Je comprend bien g++, je suis d'accord, mais comment faire ?

    J'ai un peu essayer de regarder du côté de la surcharge des opérateur << et >> de iostream et autre stringstream mais honnêtement je n'y comprend plus grand chose.

    Quelqu'un peut-il m'aider ?

    Note: Merci d'être indulgent si j'ai dit de grosses bêtises par exemples

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il suffit de modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> void operator <<(const T& stuff);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> MaClasse& operator <<(const T& stuff);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    void MaClasse::operator <<(const T& stuff){
        cout << "Test: " << stuff << endl;
    }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    MaClasse& MaClasse::operator <<(const T& stuff){
        cout << "Test: " << stuff << endl;
        return *this;
    }
    Car si tu fais, avec ton code :
    cela va en fait être :
    qui a comme type de retour void... autrement dit qui ne retourne rien.

    Maintenant, si on fait :
    il y aura un problème avec ton code... car une fois que l'on a fait obj << 2, ce qui est retourné est void, donc impossible d'appeler l'opérateur << depuis un void...

    Alors que si on renvoie un MaClasse&, obj << 2 << 3 revient à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.operator<<(2).operator<<(3);
    ce qui est tout à fait valide étant donné que obj.operator<<(2) retourne une référence vers obj et permet donc d'appeler l'opérateur << .

  3. #3
    Membre régulier Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Points : 86
    Points
    86
    Par défaut
    Bonsoir et merci pour ta réponse.

    Je n'ai pas encore testé n'ayant pas le code sous la main mais j'ai saisi. Cela me parait évident maintenant
    Merci beaucoup pour ces explications très limpides !

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par contre ce n'est pas forcément la bonne solution. Un flux de sortie standard ne précise pas où il va écrire, c'est son streambuf qui va le faire. Ce qui veut dire que tu peux très bien garder cout, cerr, clog ou même une nouvelle instance de std::ostream, et simplement lui filer le streambuf approprié pour que tout soit redirigé vers ton champ de texte.

  5. #5
    Membre régulier Avatar de knoodrake
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 86
    Points : 86
    Points
    86
    Par défaut
    Bonjour Laurent,

    Je prend note de ce conseil. Je n'était pas au courant de l'existence de ce streambuff ( ni même de std::clog pour dire vrai ) mais je comprend bien l'utilité des solutions que tu évoque.
    Ce pourrait m'être d'autant plus utile que mon programme est censé pouvoir tourner en mode graphique ou texte.
    ..Et d'autant plus aussi qu'actuellement, le "obj" de mes exemples s'appelle "_cout" dans mon programme..

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

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