Accueil > Code > Overload de << et >>

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;
}
Categories: Code Tags: ,
  1. Pas encore de commentaire
  1. Pas encore de trackbacks