Démasquage opérateur <<

Démasquage opérateur <<

par 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 <<

par 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 <<

par 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 <<

par 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 <<

par 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 <<

par 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