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 :

Surcharge de l'opérateur << de ostream et flag perso


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut Surcharge de l'opérateur << de ostream et flag perso
    Bonjour,

    j'ai une petite classe toute gentille foo, pour laquelle j'ai surchargé l'opérateur << de ostream afin qu'elle sache s'afficher.

    Mais voilà, il y a plusieurs façons d'afficher une instance de foo, et j'aimerais savoir s'il y a moyen d'utiliser des flags perso avec ostream.

    Pour fixer les idées, je voudrait créer un flag verbose pour pouvoir écrire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << verbose << f << endl ;
    f est une instance de foo.

    Et même, idéalement, mais là j'abuse, je voudrais que mon flag puisse prendre un paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << verbose( 12 ) << f << endl ;
    Si j'ai bien compris, il faudrait que io_base contienne une espèce de membre "user" qui serait renseigné par verbose et utilisé par ma surcharge de <<.
    J'ai regardé pas mal de docs, et même le code des stl, et mon espoir est faible...
    Mais on ne sait jamais, j'ai peut-être raté quelque chose !

    Merci d'avance !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  2. #2
    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 surcharger l'operator << de ta classe pour qu'il prenne un parametre puis surcharger l'operator << pour qu'il prenne une instance de ta classe. Voila ce que j'ai en tete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    YourClass &YourClass::operator<<(int x)
    {
      this->x = x;
      return *this;
    }
     
    std::iostream operator<<(std::iostream &ios, YourClass const &t)
    {
       ios << t.c_str();
       return ios;
    }
    J'espere que c'est ce que tu voulais faire...

  3. #3
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Merci de ta réponse imperio, mais je ne suis pas sûr de comprendre...

    La suite logique de ton code serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    YourClass y ;
    cout << y << 3 ;
    Et du coup, la méthode c_str ajoutée à YourClass irait lire le membre x pour savoir comment s'afficher ?

    Mais j'ai peur que le 3 soit envoyé à cout et non à y.

    Pour implémenter ta solution, je pense qu'il vaudrait mieux ajouter une méthode setflags et écrire un code comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    YourClass y ;
    cout << y.setflags( 3 ) ;
    Mais cette solution m'oblige à ajouter à YourClass du code pour en gérer l'affichage, ce que je trouve un peu cracra...
    Pour moi, YourClass ne devrait pas savoir qu'on a envie de l'afficher.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Captain'Flam Voir le message
    Si j'ai bien compris, il faudrait que io_base contienne une espèce de membre "user" qui serait renseigné par verbose et utilisé par ma surcharge de <<.
    J'ai regardé pas mal de docs, et même le code des stl, et mon espoir est faible...
    Mais on ne sait jamais, j'ai peut-être raté quelque chose !
    Si j'ai bien compris, c'est à ça que sert ios_base :: xalloc().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Il y a un exemple sur cette doc de std::ios_base::iword.

  6. #6
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Merci Médinoc (encore une fois... )
    Si j'ai bien compris, c'est à ça que sert ios_base :: xalloc().
    Et oui, c'est exactement ça.
    Je suis pourtant passé dessus en lisant les docs des stl, mais j'ai dû l'écarter en l'assimilant à une espèce de "user alloc" (comme le XALLOC de la lib opensll que j'ai beaucoup fréquenté dans ma jeunesse...).

    Le seul hic, c'est que ça m'oblige à ajouter une globale (le int retourné par xalloc).
    A moins que je ne l'ajoute dans ma classe foo...

    En tout cas merci !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Évidemment tu en fais une variable statique de classe.

    En fait, quand j'ai lu sur xalloc() ça m'a surtout rappelé le TlsAlloc() du Thread-Local Storage de Windows, qui est basé un peu sur le même principe.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Réponses: 8
    Dernier message: 29/08/2006, 00h56
  3. [C#] Surcharge de l'opérateur ==
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2006, 16h19
  4. Réponses: 6
    Dernier message: 12/07/2006, 15h34
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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