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:
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:
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:
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:
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:
friend Complexe& operator>>(std::istream& flux, Complexe&) ;
et la deuxième qui marche tout autant :
Code:
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:
friend void operator>>(std::istream& flux, Complexe&) ;
Ma question est donc : Pourquoi la première solution serait la meilleure ?
Merci à tous
JMC55
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