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 :
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".
Code : Sélectionner tout - Visualiser dans une fenêtre à part istream& operator>>(istream& flux, Objet& unObjet) ;
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 :
avec dans le fichier complexe.h la déclaration d'amitié 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 ; }
Cela marche très bien ... et ne m'étonne pas puisque je me conforme en tout point à ce que tous les auteurs recommandent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part friend std::istream& operator>>(std::istream& flux, Complexe&) ;
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 :
avec dans le complexe.h la déclaration d'amitié suivante :
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 ; }
et la deuxième qui marche tout autant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part friend Complexe& operator>>(std::istream& flux, Complexe&) ;
avec dans le complex.h la déclaration d'amitié suivante :
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 ; }
Ma question est donc : Pourquoi la première solution serait la meilleure ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part friend void operator>>(std::istream& flux, Complexe&) ;
Merci à tous
JMC55
Partager