Surcharge d'opérateur : comprend pas - C++ - Programmation
Marsh Posté le 15-07-2006 à 11:25:38
Donne tout le prog, parce que là, il manque trop d'infos.
Marsh Posté le 15-07-2006 à 11:28:24
Voila:
Code :
|
Marsh Posté le 15-07-2006 à 11:36:39
On dirait que le prog appelle implicitement le constructeur Chaine(char *chaine) pour créer une Chaine à la volée.
Que dit ton compilo ? (warnings)
Marsh Posté le 15-07-2006 à 11:46:11
Ca a l'air d'être ça:
http://blogs.msdn.com/oldnewthing/ [...] 05974.aspx
Citation : It did this because a constructor that takes exactly one argument serves two purposes: It can be used as a traditional constructor (as we saw with BigBuffer temp(3)) or it can be used to provide an implicit conversion from the argument type to the constructed type. |
Il semblerait que tu viennes de tomber sur l'une des nombreuses obscures idiosyncrasies du langage le plus complexe du monde. Bienvenue dans le monde merveilleux du C++ !
Essaye avec le mot-clé explicit devant le constructeur pour voir ce que ça donne. Si le compilo refuse, mon explication a toute chance d'être la bonne. Il est probable que tu ne l'aies pas vu dans tes cours, il est relativement récent et peu connu (pour tout te dire, je ne le connaissais pas jusqu'à il y a 10 mn...).
Marsh Posté le 15-07-2006 à 12:03:13
ca n'a rien d'obscure, le compilo cherche un moyen pour convertir et trouve le contructeur qui va, mais c'est sur qu'il vaut mieux savoir ca avant de faire de la surcharge et il faut aussi connaitre const et reference.
a mon avis ils faudrait aussi eviter d'implementer un operateur + avec le comportement d'un operateur +=, meme si on est libre de le faire c'est peut etre pas ce que tu voulais faire.
Marsh Posté le 15-07-2006 à 12:20:35
Les conversions implicites, c'est mal.
D'ailleurs le mot-clé explicit est apparu plus tard, et certainement parce que ce comportement a été critiqué à juste raison.
Marsh Posté le 15-07-2006 à 12:28:57
Merci pour vos réponses...mais :
1) Je n'ait aucun warning
2) Avec le mot explicit : je n'ait aucun warning et la programme fonctionne très bien aussi.
NB : Mon compilateur : g++ 4.1
Marsh Posté le 15-07-2006 à 12:56:51
ReplyMarsh Posté le 15-07-2006 à 13:01:00
lol...ça me rassure je ne suis pas le seul à ne pas comprendre...
En tout cas, je croit que ma première surcharge est bien plus recommandable que la deuxième
Marsh Posté le 15-07-2006 à 13:20:34
Tu as fait g++ -Wall ?
Marsh Posté le 15-07-2006 à 13:29:56
pourquoi ca ne devrait pas compiler ? et regarde un cours sur la surcharge d'operateur parce que la...
Marsh Posté le 15-07-2006 à 13:33:18
part de la
Code :
|
ou mieux
Code :
|
Marsh Posté le 15-07-2006 à 13:33:25
skelter a écrit : pourquoi ca ne devrait pas compiler ? et regarde un cours sur la surcharge d'operateur parce que la... |
sta dire que je l'ai un peu oublié, je fais un mois de C++ pendant l'année après j'oublie.
mais il est clair que je dois revoir un cour de C++
Marsh Posté le 15-07-2006 à 13:36:02
zapan666 a écrit : |
je disais ca pour casafa, la surcharge d'operateur necessite certaines connaissances qu'il ne semble pas avoir, on ne peut pas sauter les chapitres qui le precedent
Marsh Posté le 15-07-2006 à 13:42:22
skelter a écrit : pourquoi ca ne devrait pas compiler ? et regarde un cours sur la surcharge d'operateur parce que la... |
Ca n'a strictement rien d'évident, contrairement à ce que tu sembles dire. On est dans un cas où le typage strict est clairement violé par la conversion implicite, et pour ça, c'est pourri.
D'ailleurs sur la page que j'ai donnée, justement titrée Beware the implicit conversion, il n'y a qu'à voir le nombre de commentaires qu'un code apparemment bateau génère.
L'un d'entre eux dit très justement:
Citation : Found this out very early on while learning c++. |
ps: évidemment, personne de sensé n'écrirait du code comme celui de notre exemple, on est bien d'accord.
Marsh Posté le 15-07-2006 à 23:24:06
Personne d'autre n'a une idée ?
'tain la déception
Marsh Posté le 16-07-2006 à 18:31:07
ReplyMarsh Posté le 16-07-2006 à 18:44:24
Avec explicit, g++ (4.1.2) me sort une erreur. C'est rassurant
Marsh Posté le 16-07-2006 à 19:02:12
J'ai du me tromper je ne sais pas où hier mais en fait ça ne compile pas avec le mot "explicit"...dsl
Par contre je demande bien pourquoi ils ont mis une telle surcharge dans mon livre sur le c++
Marsh Posté le 15-07-2006 à 11:16:55
Bonjour,
Dans ma fonction main j'ai ceci:
Et voici comment j'ai fait pour surcharger l'opérateur +:
J'ai vu sur plusieurs sites que ceci : "titre = titre + "du prog";" correspondait à ceci : "titre = titre.operator+("du prog" )".
Jusque là je comprend tout...ce que je ne comprend pas c'est si je change mon code d'en haut en ceci, ça fonctionne toujours:
La fonction me retourne un char* alors que je recupère le résultat dans titre qui n'est pas dutout un char mais une classe Chaine !
De plus dans ce cas, le "code" suivant n'a plus aucun sens : "titre = titre.operator+("du prog" )"...
Donc ma question : comment ça se fait que le code fonctionne avec la surcharge "char *operator+(char *ajout_ch)" ?
Merci d'avance...