Objet et flux de sortie
Par Cédric Tabin le jeudi 07.05.2009, 10:00 - C/C++ - Lien permanent
Voila une nouvelle dimension ajoutée à mon blog : la catégorie C/C++ ! Et je commence directement avec une petite astuce pour pouvoir afficher un objet dans la sortie standard (cout).
Voici la classe Person que je vais utiliser :
#ifndef _PERSON_H #define _PERSON_H #include <string> using namespace std; class Person { public: inline Person(string name, string firstName) : _name(name), _firstName(firstName) {} inline string getName() const { return _name; } inline void setName(string name) { _name = name; } inline string getFirstName() const { return _firstName; } inline void setFirstName(string firstName) { _firstName = firstName; } private: string _name; string _firstName; }; #endif
L'idée est de pouvoir afficher une instance Person dans le flux de sortie standard (la console par défaut) en faisant ceci :
Person p("tabin", "cedric"); cout << p << endl;
Mais cela ne passera pas la compilation : g++ sort l'erreur suivante :
error: no match for ‘operator<<’ in ‘std::cout << p’
Il est possible d'essayer la même variante avec un pointeur :
Person* p = new Person(); cout << p << endl; delete p;
La compilation va passer sans problème. Par contre, le texte affiché sera simplement l'adresse mémoire du pointeur (un truc genre 0x804b1c8), ce qui ne sert pas à grand chose.
Pour contourner cela, la méthode est assez simple : elle consiste à surcharger l'opérateur << pour qu'il puisse afficher l'objet en question. Afin de faciliter la chose, on peut surcharger l'opérateur pour qu'il traite un pointeur ou une référence à une instance Person :
ostream& operator<<(ostream& o, Person* p) { o << p->getName() << " " << p->getFirstName(); return o; } ostream& operator<<(ostream& o, Person& p) { o << p.getName() << " " << p.getFirstName(); return o; }
Et le tour est joué !