Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2935 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Surcharge d'opérateur : comprend pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Surcharge d'opérateur : comprend pas

n°1407167
casafa
Posté le 15-07-2006 à 11:16:55  profilanswer
 

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

mood
Publicité
Posté le 15-07-2006 à 11:16:55  profilanswer
 

n°1407169
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 11:25:38  profilanswer
 

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
n°1407171
casafa
Posté le 15-07-2006 à 11:28:24  profilanswer
 

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
n°1407175
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 11:36:39  profilanswer
 

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
n°1407178
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 11:46:11  profilanswer
 

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
n°1407184
skelter
Posté le 15-07-2006 à 12:03:13  profilanswer
 

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.

n°1407191
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 12:20:35  profilanswer
 

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
n°1407196
casafa
Posté le 15-07-2006 à 12:28:57  profilanswer
 

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

n°1407212
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 12:56:51  profilanswer
 
n°1407216
zapan666
Tout est relatif
Posté le 15-07-2006 à 13:00:17  profilanswer
 

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 !
mood
Publicité
Posté le 15-07-2006 à 13:00:17  profilanswer
 

n°1407217
casafa
Posté le 15-07-2006 à 13:01:00  profilanswer
 

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

n°1407224
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 13:20:34  profilanswer
 
n°1407229
casafa
Posté le 15-07-2006 à 13:29:19  profilanswer
 

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

n°1407230
skelter
Posté le 15-07-2006 à 13:29:56  profilanswer
 

pourquoi ca ne devrait pas compiler ? et regarde un cours sur la surcharge d'operateur parce que la...

n°1407232
skelter
Posté le 15-07-2006 à 13:33:18  profilanswer
 

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
n°1407233
zapan666
Tout est relatif
Posté le 15-07-2006 à 13:33:25  profilanswer
 

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 !
n°1407238
skelter
Posté le 15-07-2006 à 13:36:02  profilanswer
 

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

n°1407243
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 13:42:22  profilanswer
 

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
n°1407318
el muchach​o
Comfortably Numb
Posté le 15-07-2006 à 23:24:06  profilanswer
 

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
n°1407656
oseam
Yume wa kitto kanau
Posté le 16-07-2006 à 18:31:07  profilanswer
 

el muchacho a écrit :

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


 
Une idée sur ?

n°1407662
verdoux
And I'm still waiting
Posté le 16-07-2006 à 18:44:24  profilanswer
 

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

n°1407675
casafa
Posté le 16-07-2006 à 19:02:12  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Surcharge d'opérateur : comprend pas

 

Sujets relatifs
Error que je ne comprend pasJe ne comprend pas tout... Une petite explication serait sympathique.
Je comprend pas pourquoi...Je ne comprend pas tout...
[XML/XSLT] J'ai la solution mais je comprend rien ...operateur de test résolu
Parse error: j'y comprend rien du tout...Afficher un message d'excuse quand le serveur est surchargé
(résolu) surcharge operateur << 
Plus de sujets relatifs à : Surcharge d'opérateur : comprend pas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR