OVH Cloud OVH Cloud

surcharge opérateur

3 réponses
Avatar
Stephane Wirtel
Bonjour à tous,

Je suis un peu ennuyer concernant la conception d'une surcharge de
l'opérateur <<.

Pour le moment, j'ai ma class String et j'utilise une fonction amie pour
surcharger <<.

Ce qui donne:

class String
{
public:
friend ostream& operator << (ostream& out, const String& str);
};

ostream& operator << (ostream& out, const String& str)
{
out << str.getText();
return out;
}

J'aimerais savoir si il est possible de ne plus employer une fonction amie
pour utiliser cet opérateur pour ma classe. Je pense que non, mais je
préfère être certain.



Bien à vous,

Stéphane

3 réponses

Avatar
Jean-Marc Bourguet
Stephane Wirtel writes:

J'aimerais savoir si il est possible de ne plus employer
une fonction amie pour utiliser cet opérateur pour ma
classe. Je pense que non, mais je préfère être certain.


Les opérateurs membres ont d'office l'argument de gauche (ou
l'unique argument) du type de la classe.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Loïc Joly
Stephane Wirtel wrote:
Bonjour à tous,

Je suis un peu ennuyer concernant la conception d'une surcharge de
l'opérateur <<.

Pour le moment, j'ai ma class String et j'utilise une fonction amie pour
surcharger <<.
[...]

J'aimerais savoir si il est possible de ne plus employer une fonction amie
pour utiliser cet opérateur pour ma classe. Je pense que non, mais je
préfère être certain.


Tu peux aussi dans ta classe définir une fonction publique
(éventuellement virtuelle) :

void print(std::ostream &os);

Et avoir une fonction libre operator<< qui appèlle cette fonction.
Avantage : si tu a une hiérarchie de classe, et une fonction print
virtuelle pure, tu peux t'assurer que toutes les classes dérivées
implémentent l'affichage.

--
Loïc

Avatar
James Kanze
Stephane Wirtel writes:

|> Je suis un peu ennuyer concernant la conception d'une surcharge de
|> l'opérateur <<.

|> Pour le moment, j'ai ma class String et j'utilise une fonction amie
|> pour surcharger <<.

|> Ce qui donne:

|> class String
|> {
|> public:
|> friend ostream& operator << (ostream& out, const String& str);
|> };

|> ostream& operator << (ostream& out, const String& str)
|> {
|> out << str.getText();
|> return out;
|> }

|> J'aimerais savoir si il est possible de ne plus employer une
|> fonction amie pour utiliser cet opérateur pour ma classe. Je pense
|> que non, mais je préfère être certain.

Je dirais qu'en général, c'est plutôt rare d'avoir besoin que
l'opérateur << soit un ami. Une classe comme String est peut-être
l'exception, mais en général, ce que tu veux afficher, c'est la valeur
telle qu'elle apparaît à l'utilisateur, c-à-d donc que les choses
visibles d'une façon à autre à travers l'interface publique.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34