Surcharge d'opérateur : comprend pas

Surcharge d'opérateur : comprend pas - C++ - Programmation

Marsh Posté le 15-07-2006 à 11:16:55    

Bonjour,
 
Dans ma fonction main j'ai ceci:

Code :
  1. int main()
  2. {
  3. Chaine titre("la bible " );
  4. titre = titre + "du prog";
  5. titre.affiche(); //Affiche : la bible du prog
  6. return 0;
  7. }


 
Et voici comment j'ai fait pour surcharger l'opérateur +:

Code :
  1. Chaine operator+(char *ajout_ch)
  2. {
  3. strcat(this->buffer, ajout_ch);
  4. return (*this);
  5. }


 
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:

Code :
  1. char *operator+(char *ajout_ch)
  2. {
  3. return(strcat(buffer, ajout_ch));
  4. }


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

Reply

Marsh Posté le 15-07-2006 à 11:16:55   

Reply

Marsh Posté le 15-07-2006 à 11:25:38    

Donne tout le prog, parce que là, il manque trop d'infos.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 15-07-2006 à 11:28:24    

Voila:
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class Chaine
  4. {
  5. public:
  6.  char *operator+(char *ajout_ch)
  7.  {
  8.   return(strcat(buffer, ajout_ch));
  9.  }
  10.  /*Chaine operator+(char *ajout_ch)
  11.  {
  12.   strcat(this->buffer, ajout_ch);
  13.   return (*this);
  14.  }*/
  15.  void affiche(void)
  16.  {
  17.   cout<<buffer<<endl;
  18.  }
  19.  Chaine(char *chaine)
  20.  {
  21.   strcpy(buffer, chaine);
  22.  }
  23. private:
  24.  char buffer[256];
  25. };
  26. int main()
  27. {
  28. Chaine titre("la bible " );
  29. titre = titre + "du prog";
  30. titre.affiche();
  31. return 0;
  32. }


Message édité par casafa le 15-07-2006 à 11:29:00
Reply

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)


Message édité par el muchacho le 15-07-2006 à 11:38:14

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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++ ! [:itm]
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...).


Message édité par el muchacho le 15-07-2006 à 11:56:07

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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.

Reply

Marsh Posté le 15-07-2006 à 12:20:35    

Les conversions implicites, c'est mal. :o
D'ailleurs le mot-clé explicit est apparu plus tard, et certainement parce que ce comportement a été critiqué à juste raison.


Message édité par el muchacho le 15-07-2006 à 12:21:20

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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

Reply

Marsh Posté le 15-07-2006 à 12:56:51    

Reply

Marsh Posté le 15-07-2006 à 13:00:17    

drapal
 
 
ce soir, j'essaye de compiler ce code, y'a un truc que je trouve louche : je pige pas pourquoi ça compile : il ne faudrait pas redéfinir l'operateur+ avec deux opérandes que l'operateur+ avec un seul ? :??:


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 15-07-2006 à 13:00:17   

Reply

Marsh 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 ;)

Reply

Marsh Posté le 15-07-2006 à 13:20:34    

Reply

Marsh Posté le 15-07-2006 à 13:29:19    

oui : "g++ -Wall main.cpp"

Reply

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

Reply

Marsh Posté le 15-07-2006 à 13:33:18    

part de la

Code :
  1. chaine chaine::operator+ (const chaine & ) const;


ou mieux

Code :
  1. chaine operator+ (const chaine &, const chaine & );


Message édité par skelter le 15-07-2006 à 13:33:43
Reply

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


 [:maverick10] 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++  [:theepsilon]


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 15-07-2006 à 13:36:02    

zapan666 a écrit :


mais il est clair que je dois revoir un cour de C++  [:theepsilon]


 
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

Reply

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++.
This little 'feature' can cause all sorts of basicly broken code to compile if you're not aware of it.
Altough i can see the reason for including it, it allows the same syntax to be used for implicit conversion in the way that its supported for native types.
That a constructor becomes a conversion operator without some kind of keyword however is not something i like, and i hope new languages will invert the use of something like 'explicit'.


 
ps: évidemment, personne de sensé n'écrirait du code comme celui de notre exemple, on est bien d'accord.


Message édité par el muchacho le 15-07-2006 à 13:46:12

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 15-07-2006 à 23:24:06    

Personne d'autre n'a une idée ?
 
'tain la déception :/


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 16-07-2006 à 18:31:07    

el muchacho a écrit :

Personne d'autre n'a une idée ?
 
'tain la déception :/


 
Une idée sur ?

Reply

Marsh Posté le 16-07-2006 à 18:44:24    

Avec explicit, g++ (4.1.2) me sort une erreur. C'est rassurant :o

Reply

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++ :(


Message édité par casafa le 16-07-2006 à 19:02:33
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed