Démasquage opérateur <<

Démasquage opérateur <<

by Tamara Paris -
Number of replies: 5
Bonjour,
En dehors de ma classe Toupie j'ai codé l'opérateur<< pour afficher une toupie, puis en dehors de ma classe ConeSimple j'aimerais également coder l'opérateur << qui utiliserais d'abord l'opérateur << relatif à la classe Toupie et qui rajouterais des informations en plus, cependant je n'arrive pas à trouver la syntaxe exacte pour faire un démasquage de l'opérateur << (si c'est possible de le faire).
Merci d'avance
In reply to Tamara Paris

Re: Démasquage opérateur <<

by Josué Antoine Maechling -
il faudrait faire une fonction affiche qui prend un ostream en référence, utiliser le polymorphisme pour pouvoir la redéfinir dans la sous-classe. Une fois dedans tu peux utiliser celle de la super classe en utilisant l'opérateur de résolution de portée (c'est bien ça le nom j'espère) Toupie::affiche par exemple.
Ainsi ton opérateur<< aura juste à faire appel à la fonction affiche.
In reply to Tamara Paris

Démasquage opérateur <<

by Tamara Paris -
Oui j'avais pensé à cette solution alternative mais je voulais savoir si on pouvais directement démasquer un opérateur sans avoir besoin de passer par une fonction
In reply to Tamara Paris

Re: Démasquage opérateur <<

by Deleted user -

Tu peux utiliser un static_cast pour convertir ton ConeSimple,

std::cout << std::static_cast<Toupie>(mon_conesimple);

In reply to Deleted user

Re: Démasquage opérateur <<

by Jean-Cédric Chappelier -

JAMAIS de cast dans mon cours !

Les cast sont un aveu de faiblesse, un manque d'effort de conception propre. ;-) Et sont souvent source de plein de problèmes (incompatibilité / perte de propriétés).

Le bon « pattern » dans ce cas est effectivement celui de la méthode interne, sur laquelle nous reviendrons justement dans le cours de cette semaine.
Ce « pattern » a déjà été évoqué lors de l'étude de cas de la surcharge des opérateurs : lorsque l'on veut avoir en externe quelque chose que l'on ne peut avoir qu'en interne, une bonne chose à faire est de faire une méthode (interne) et de l'appeler dans une fonction (externe).
Ici vous voulez (ce n'est pas votre problème/votre question ; mais c'est le point de départ) du polymorphisme dans une fonction (operator<<). Or le polymorphisme est, par nature même, quelque chose « d'interne » (= lié aux classes). Il faut donc que votre fonction appelle une méthode polymorphique.
Cette solution vous permet alors de résoudre votre problème : il est simple de démasquer des méthodes de super-classes dans les sous-classes.

In reply to Jean-Cédric Chappelier

Re: Démasquage opérateur <<

by Eliot Bornand -

Bonjour,

Je profite de cette conversation car je me suis retrouvée exactement dans la même situation.

Mon problème est que le polymorphisme ne fonctionne pas car, dans ma fonction operator<<, la toupie ne peut pas être prise par référence (du moins ça ne compile pas) de cette manière :

ostream& operator<<(ostream& sortie, Toupie const& toupie);

Je suis alors obligé de faire un passage par valeur, et donc même si j'utilise par exemple une fonction interne affiche(), elle fera toujours appel à la méthode général de Toupie et non pas à ses spécialisations dans les sous-classes.

Comment puis-je faire ?

Merci