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