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 d'opérateurs de flux


Sujet :

C++

  1. #1
    Futur Membre du Club

    Profil pro
    Consultant communication & réseaux
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Billets dans le blog
    3
    Par défaut Surcharge d'opérateurs de flux
    Je cherche à comprendre pourquoi la documentation que j'ai consulté sur le net semble unanime pour proposer en matière de surcharge de l'opérateur de flux >> une fonction externe à la classe, déclarée amie dans la classe et ayant le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    istream& operator>>(istream& flux, Objet& unObjet) ;
    J'ai fait un petit exercice avec une classe "nombres complexes" ultra simple : deux attributs privés "double" pour les parties réelles et imaginaires et un constructeur avec deux paramètres double pour initialiser l'objet "nombre complexe".
    Puis pour entrer au clavier un nombre complexe dans le main.cpp, j'ai surchargé l'opérateur >> de 3 façons différentes :
    La façon classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    istream& operator>>(istream& flux, Complexe& a) 
    {
        cout<<"partie reelle ? "<< endl ;
        flux>>a.m_r ;
        cout<<"partie imaginaire ?" << endl ;
        flux>>a.m_i ;
        return flux ;
    }
    avec dans le fichier complexe.h la déclaration d'amitié classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend std::istream& operator>>(std::istream& flux, Complexe&) ;
    Cela marche très bien ... et ne m'étonne pas puisque je me conforme en tout point à ce que tous les auteurs recommandent.
    Mais ce qui m'étonne un peu plus, c'est que les deux autres façons de surcharger l'opérateur >>, qui suivent marchent tout aussi bien et me semblent tout aussi logiques. Les voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Complexe& operator>>(istream& flux, Complexe& a) // 
    {
        cout<<"partie reelle ? "<< endl ;
        flux>>a.m_r ;
        cout<<"partie imaginaire ?" << endl ;
        flux>>a.m_i ;
        return a ;
    }
    avec dans le complexe.h la déclaration d'amitié suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend Complexe& operator>>(std::istream& flux, Complexe&) ;
    et la deuxième qui marche tout autant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void operator>>(istream& flux, Complexe& a) 
    {
        cout<<"partie reelle ? "<< endl ;
        flux>>a.m_r ;
        cout<<"partie imaginaire ?" << endl ;
        flux>>a.m_i ;
    }
    avec dans le complex.h la déclaration d'amitié suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend void operator>>(std::istream& flux, Complexe&) ;
    Ma question est donc : Pourquoi la première solution serait la meilleure ?
    Merci à tous
    JMC55

  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
    Normalement le mieux pour ton opérateur >> c'est surtout de retourner lui-même pour pouvoir chaîner les appels. En retournant un Complexe& ou void tu empêches cette syntaxe des plus sexyes
    Quant à savoir pourquoi l'un ou l'autre est mieux.. amha ça tient de la préférence personnelle.
    L'avantage avec un opérateur externe, c'est que tu peux l'ajouter à ta classe sans avoir à la modifier, sans avoir à y ajouter une fonction membre, ce qui est parfois impossible justement. Et il me semble que C++17 prépare quelque chose en ce sens justement. Mais pas de quoi fouetter un débutant
    Mais si tu dois le déclarer friend, aucun intérêt donc.
    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
    Futur Membre du Club

    Profil pro
    Consultant communication & réseaux
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Billets dans le blog
    3
    Par défaut Surcharge de l'opérateur de flux
    Merci beaucoup pour votre réponse rapide. J'ai compris que le chainage de l'opérateur de flux >> n'est possible que si la valeur de retour est du type référence sur un istream (on peut faire le même constat avec ostream). Un bon apprentissage nécessite beaucoup d'expérimentations !!!! Merci encore
    JMC55

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Pourtant contrairement à Bousk, je n'avais pas compris comme cela

    Il y a les opérateurs qu'on est obligé de mettre en membre à cause du compilateur: operator=, operator[], operator*, operator&, operator-> ...

    Ensuite cela va dépendre si dans la fonction amie, le premier paramètre (le plus à gauche) est un type que l'on peut modifier (ou un type simple).

    Si oui, alors soit une méthode soit une fonction amie. Mais pour les opérateurs qui ne modifie pas le this, on préfère la fonction amie pour ne pas surcharger la classe.

    Sinon, comme les streams istream, on préfère la fonction amie pour des histoires de conversions.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Personnellement, j'éviterais de faire une surcharge de operator>> qui soit interactive: Si je veux une fonction qui demande à l'utilisateur les données plutôt que lire en silence, j'en fais une vraie fonction, et non une surcharge d'opérateur.
    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.

  6. #6
    Futur Membre du Club

    Profil pro
    Consultant communication & réseaux
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Billets dans le blog
    3
    Par défaut Réponse à Médinoc
    Je partage tout à fait la remarque de Médinoc. Mon propos initial était didactique : envisager toutes les façons de concevoir une surcharge d'opérateurs de flux, même les plus "non conventionnelles" mais il est assez évident que dans un développement professionnel il vaut mieux éviter de surcharger l'opérateur >>. Merci encore pour vos remarques.

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

Discussions similaires

  1. Problème avec la surcharge d'opérateur de flux
    Par spirzouf dans le forum Débuter
    Réponses: 10
    Dernier message: 06/09/2011, 21h16
  2. 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
  3. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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