Probleme de surcharge d'opérateur et de fonction amies - C++ - Programmation
Marsh Posté le 27-09-2007 à 19:08:09
[icode]operator double()[/icode] doit renvoyer un double
ca reglera ton dernier test...
----
note: pour la balise, http://kangol.prout.be/gm/md_inlinecode.user.js
Marsh Posté le 27-09-2007 à 19:25:05
bha vu que tu lui dit comment convertir en double, il le sais ...
Marsh Posté le 27-09-2007 à 19:31:36
mais en fait ce que je voulais en faisant ça c'était de contourner l'ambiguitée qu'il y avait en transformant un double en un élément de la classe fille , ca ne m'intéresse pas de convertir en double . Je dois m'être mal organisé dans l'héritage ou je ne sais quoi, je bloque complétement ...
Marsh Posté le 27-09-2007 à 19:58:02
tu me copieras 10000 fois :
"les operateurs binaires ne s'implantent pas comme des fonctions firends masi comme des fonctiosn libres"
Marsh Posté le 27-09-2007 à 20:03:34
Joel F a écrit : tu me copieras 10000 fois : |
Et pourquoi pas des friends?
Marsh Posté le 27-09-2007 à 20:06:06
mais je suis obliger de faire appel a une fonction non membre , sinon je ne peut pas résoudre l'opération V = 2 * V par exemple , j'ai vu ca sur ce site :
http://www.emse.fr/~boissier/ensei [...] non-membre
ça avais l'air d'être des cours donc bon ...
Marsh Posté le 27-09-2007 à 22:51:34
Ace17 a écrit : |
parce que les operateurs binaires de type +-*/ sont symmétriques. Dans a+b, a n'a pas de rôle à jouer face à b, ca elimine d'office la fonction memebre. Reste donc fonction libre ou amie.
La Fonction ami pete l'encapsulation alors que la fonction libre suffit a faire ce dotn tu as besoin en utilisant les accesseurs/mutateurs qui vont bien.
Quant à V =2*V ... faudra voir à mettre des ocnstructeurs explicites, écrire une Forme Canonique de Coplien et a pas utiliser le Bartman&Norton's Trick quand on sait pas s'en servir à bon escient.
Ah ouais, et pour preparer vendredi, ce cours est à chier
une version g++ compliant :
Code :
|
Ensuite tu m'expliqueras comme Vitesse*Vitesse ca donne un double OU une vitesse au carré, c'est pas homogène
Marsh Posté le 27-09-2007 à 23:19:01
Joel F a écrit : |
Jusque-la, je suis completement d'accord avec toi.
Joel F a écrit : |
Je ne vois pas en quoi la fonction amie "pete" l'encapsulation ... peux-tu me donner un exemple ou l'emploi des fonctions amies est justifie, dans ce cas? N'existe-t-il pas des cas ou un operateur binaire doit manipuler des membres prives auquels il serait peu judicieux de donner acces, meme a travers un accesseur?
Marsh Posté le 27-09-2007 à 23:26:45
Ace17 a écrit : Je ne vois pas en quoi la fonction amie "pete" l'encapsulation ... peux-tu me donner un exemple ou l'emploi des fonctions amies est justifie, dans ce cas? N'existe-t-il pas des cas ou un operateur binaire doit manipuler des membres prives auquels il serait peu judicieux de donner acces, meme a travers un accesseur? |
Je pense que c'est comme tu dis: 'des cas'. Donc à n'utiliser que lorsque l'usage y est strictement nécessaire... à mon avis.
Marsh Posté le 28-09-2007 à 00:05:39
Franchement c'est ingénieux comme truc j'aurais jamais pensé a une implémentation comme ça, pour Vitesse*Vitesse ça devrait rendre un double mais je pense que je m'en sortirais. Je te remercie parce que j'étais vraiment bloqué
Marsh Posté le 28-09-2007 à 08:57:36
IrmatDen a écrit : |
C'est exactement ça. Si tu peut pas faire autrement, vas y fait une fonction amie. Mais, à l'usage, tu t'apercevra que, dans 99.999999932648% des cas,
t'en a pas besoin car tu as ta pelleté d'accesseur/mutateur.
@titeuf789 : je comprends pas pkoi vitesse*vitesse ca devrait renvoyer un double o_O c'est physiquement incorrect.
@le reste :
Pour infos : http://boost.org/libs/mpl/doc/tuto [...] lysis.html
Boost::MPL fournit un exemple avec une implantation plus poussée mais utilisant le même genre d'idée.
Marsh Posté le 27-09-2007 à 18:32:47
Bonjour, j'aurais besoin d'explication pour mon programme. Voici la situation , j'aimerais en gros réaliser les operations suivantes :
J'ai donc deux problémes que je n'arrive pas à résoudre, voici mon code :
Déjà je ne comprend pas vraiment pourquoi V = 2 * V me rend un resultat correct puisque d'apres ce que j'ai compris une classe fille ne peut pas se servir des fonctions amies de la classe mére ??? mais il me fallait des fonctions non membre pour réaliser cette opération.
Pour V = V * 2 par contre, le compilateur me sort :
erreur: ambiguous overload for ‘operator*’
note: candidats sont: Longueur Vitesse::operator*(const Temps& ) const
note: Vitesse operator*(const Vitesse&, const Vitesse& )
Le nombre ne connait donc pas son type de convertion, c'est donc mon modéle qui est faux mais je ne voit pas comment organiser les choses différemment. Je pensais a surcharger l'operateur de convertion des doubles sinon, dans la classe générique :
mais le compilateur n'aime pas apparemment ...
Le dernier test d = V * V reste un mystére, j 'ai l'erreur suivante :
erreur: cannot convert ‘Vitesse’ to ‘double’ in assignment
Je ne comprend pas pourquoi le double n'est pas transformer en une instance de Vitesse, puisqu'il le fait très bien lors de la multiplication 2*V , j'ai donc essayé de réécrire l'opérateur d'affectation mais toujours rien ...
Donc voilà je ne sais plus trop quoi faire et une petite aide serait la bien venue, merci d'avance