[C++] Surcharge de operator<<

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C++] Surcharge de operator<<

Message  XavBod le Jeu 13 Mai 2010, 17:17

Bonjour bonjour Smile
J'aurais aimé avoir de l'aide pour trouver où se trouve mon erreur dans la surcharge de ce superbe opérateur qu'est le '<<'
D'après ce que j'ai lu sur internet, la surchage demande 2 arguments : une reference vers un ostream et une reference vers l'objet pour lequel on souhaite realiser la surcharge.
Celui renvoie une référence de ostream ....
ostream & operator<<(ostream & out, monType & monObj)

Bizarrement si je lui met ca, on m'envoie joliment bouler avec en me disant que l'operateur n'attends que un seul argument (`std::ostream& monDouble::operator<<(std::ostream&, monDouble&)' must take exactly one argument

Code:
 
// monDouble.cpp
std::ostream & monDouble::operator<<(std::ostream & out, monDouble & ref){

   out<<ref.getVal();
   return out;
}
http://monDouble.h
std::ostream & operator<<(std::ostream &,monDouble &);

Ce que je ne comprends pas c'est que si la fonction qui se trouve dans le .cpp est placé dans le main, ca marche ><
n'y a til pas un moyen de l'incoporer à ma classe ??
bref ca fait gros noob mais je coince dessus depuis une bonne heure :X


Dernière édition par XavBod le Ven 14 Mai 2010, 18:53, édité 2 fois

XavBod

Nombre de messages : 196
Age : 26
Prénom : Xavier
Statut : Etudiant 3eme indu
Localisation : Woluwe
Date d'inscription : 27/09/2008

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  nvs le Jeu 13 Mai 2010, 17:26

XavBod a écrit:Ce que je ne comprends pas c'est que si la fonction qui se trouve dans le .cpp est placé dans le main, ca marche ><
n'y a til pas un moyen de l'incoporer à ma classe ??
bref ca fait gros noob mais je coince dessus depuis une bonne heure :X
je m'entends encore poser ces questions au cours : je veux surcharger l'opérateur << dans une classe. laquelle ? pourquoi ?

indices : toute méthode d'objet a un argument implicite + si la méthode est un opérateur binaire, c++ décide de mettre cet argument à gauche.






_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  nvs le Jeu 13 Mai 2010, 18:18

sinon, ici, il y a des informations (que tu as peut-être déjà lues).









_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  XavBod le Jeu 13 Mai 2010, 18:36

shame on me

thx :d

XavBod

Nombre de messages : 196
Age : 26
Prénom : Xavier
Statut : Etudiant 3eme indu
Localisation : Woluwe
Date d'inscription : 27/09/2008

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  XavBod le Ven 14 Mai 2010, 18:46

D'après ce que je lis, la majorité de ses opérateur son déclarés en non Membre (présence du friend)
Mais certains retourne une copie

exemple
Code:
const Integer operator++(Integer& a, int) {
  cout << "Integer++\n";
  Integer before(a.i);
  a.i++;
  return before;
}
Ici la post incrementation
--> n'est ce pas foireux si je veux encore faire des operations par la suite ?
exemple : e = f++
car mon operator= attends une reference ?

edit:
j'ai lu la page

XavBod

Nombre de messages : 196
Age : 26
Prénom : Xavier
Statut : Etudiant 3eme indu
Localisation : Woluwe
Date d'inscription : 27/09/2008

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  Marc le Sam 15 Mai 2010, 19:37

Ce qui est bien avec Xav c'est que sans lui je laisserais passer des trucs qui me font quand même tiquer Wink
Donc je me suis un peu amusé avec les post-pré incrémentation, essentiellement en regardant ce que le type de retour change quand on réutilise le résultat.
Par exemple pour ++++nb et nb++++.
Logiquement la valeur devrait de l'expression devrait augmenter de 2 dans le premier cas et ne pas augmenter dans le second tandis que la valeur de nb doit augmenter de 2 dans les deux cas.
Code:
class Integer{
private:
    int * val;
/*...*/
Integer operator++(){
      ++*val;
      return *this;
   }
Integer operator++(int){
   Integer ret=*this;
   ++*val;
   return ret;
}
Tel qu'écris là, je n'ai pas le résultat décrit plus haut. Concrètement :
Code:
nb :3 ; nb++++ :3 nb :4
++++nb :6 ; nb :5
Ce qui est logique puisque je ne récupère qu'une valeur brute donc je ne change plus nb mais juste la valeur de l'expression. J'ai donc essayé (juste pour l'opérateur préfixé) avec un renvois de référence. Là ça marche càd
Code:
nb :4 ; ++++nb :6 ; nb :6
Forcément si j'essaie de renvoyer une référence dans le code de l'opérateur postfixé, je m'embarque dans une sale galère puisque je référence un objet local (qui sera donc déjà détruit lorsque j'essayerai d'y accéder ...)

A noter cependant : le comportement que j'obtiens dans la seconde version (postFixe renvoit Integer et préFixe renvoit Integer&) est sans doute "logique" mais foireux dans la mesure l'incrémentation postfixe et préfixe n'ont pas le même résultat sur la valeur de la variable (==> ++++nb---- fait augmenter nb de 1 ...) mais par contre il a l'air de correspondre au comportement qu'on a pour les types primitifs :
Code:
int nbI = 3;
   cout<<"nbI :"<<nbI<<endl;        // ->3
   //cout<<"nbI++++ :"<<nbI++++<<endl;            //erreur de compil : réclame une lvalue
   cout<<"++++nbI :"<<++++nbI<<endl;                            //-->5
   cout<<"nbI :"<<nbI<<endl;                            //-->5
Si on me demande mon avis, je trouve pas tout ça très sain ...
Quoi ? ? "Invente un langage et on reparlera " ? Oooh méééeuuh, moi ce que j'en dit hein ...
Bon sur ce je vais m'arrêter de faire mumuse avec tout ça : j'étais sensé terminer le cours de logique

Marc

Nombre de messages : 21
Prénom : Marc
Statut : étudiant 3 indu
Localisation : Kirkcaldy (Scotland)
Date d'inscription : 18/04/2010

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  XavBod le Sam 15 Mai 2010, 20:36

Razz
Lit la partie sur la valeur de retour Wink ca te tickera surement Wink
(si j'ai bien pigé, on renvoie une référence si la lvalue doit etre modifié ^^ sinon une copie Razz)
Quand on fait d'implementer les operateurs comme des membres ou non il en touche aussi quelques mots
Bref, moi je continue logique aussi ....

XavBod

Nombre de messages : 196
Age : 26
Prénom : Xavier
Statut : Etudiant 3eme indu
Localisation : Woluwe
Date d'inscription : 27/09/2008

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  nvs le Dim 16 Mai 2010, 02:13

je n'ai pas tout lu (fora attitude) ni donc compris toute l'étendue du problème.

un résumé des incrémentations et décrémentations pré- et post-fixées : ici.

en deux mots. la pré-[in/dé]crémentation et la post-[in/dé]crémentation font toutes les deux la même chose : elles [in/dé]crémentent de 1 leur argument. du moins pour les types primitifs, pour les types définis par l'utilisateur, c'est un peu comme il veut, mais l'idée, c'est que ces deux opérateurs font la même chose.

quelle est la différence alors, s'ils font la même chose ? seule leur valeur de retour diffère.

la pré-[in/dé]crémentation retourne la valeur de son argument après [in/dé]crémentation. l[' in/a dé]crémentation a lieu, puis la valeur est retournée, d'où la dénomination de pré-[in/dé]crémentation. la post-[in/dé]crémentation retourne la valeur de l'argument avant [in/dé]crémentation. la valeur initiale est sauvegardée, la variable est [in/dé]crémentée, enfin la valeur (initiale) est retournée.

comme la post-[in/dé]crémentation doit retourner la valeur de la variable avant l['in/a dé]crémentation, elle ne peut retourner une référence vers la variable, puisqu'au moment du retour celle-ci est déjà [in/dé]crémentée. la post-[in/dé]crémentation ne peut donc que retourner un objet copie de la variable initiale. pour la pré-[in/dé]crémentation, une référence vers l'objet [in/dé]crémenté est parfaite.

notez que le lien que je renseigne ci-dessus mentionne également une version de post-[in/dé]crémentation sans retour.













_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  mvh le Dim 16 Mai 2010, 09:29

voilà qui est enfin clair !

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

Re: [C++] Surcharge de operator<<

Message  Contenu sponsorisé Aujourd'hui à 08:44


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum