Overload de << et >>
Le C++ nous offre la merveilleuse possibilité de surcharger les opérateurs pour certaines classes. Prenons par exemple une petit classe toute simple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Point { public: Point ( int NewX, int NewY ); private: int m_nX; int m_nY; public: int GetX ( void ); int GetY ( void ); }; Point::Point ( int NewX, int NewY ) { m_nX = NewX; m_nY = NewY; } int Point::GetX( void ) { return m_nX; } int Point::GetY( void ) { return m_nY; } |
Et maintenant, essayons de lui implémenter l’opérateur << pour pouvoir l’utiliser dans un cout…
Instinctivement, j’écrirais:
1 2 | public: ostream& operator << ( ostream& os, Point p ) ; |
Mais non, ca marche pas. « Trop de paramètres pour l’opérateur binaire ‘operator <<’ ». Logique, en même temps, mais comment faire pour récupérer un flux alors?
Réponse simple. Déclarer l’opérateur dans un scope global, hors de la classe.
1 2 3 4 | ostream& operator << ( ostream& os, Point p ) { os << "(" << p.GetX() << ";" << p.GetY() << ")"; return os; } |
Et hop, ça marche. Rooh, c’est beau quand même les feintes du C++. Allez, salut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <iostream> using namespace std; class Point { public: Point ( int NewX, int NewY ); private: int m_nX; int m_nY; public: int GetX ( void ); int GetY ( void ); }; Point::Point ( int NewX, int NewY ) { m_nX = NewX; m_nY = NewY; } int Point::GetX( void ) { return m_nX; } int Point::GetY( void ) { return m_nY; } ostream& operator << ( ostream& os, Point p ) { os << "(" << p.GetX() << ";" << p.GetY() << ")"; return os; } int main() { Point P(1,2); cout << P << endl; cin.ignore(); return 0; } |
Commentaires récents