Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Surcharge

4 réponses
Avatar
Etienne Rousee
Bonjour,

J'ai une classe Point3D et quelques problèmes
avec surcharge d'opérateurs, const et références.

J'ai une classe Point3D tout à fait classique.

la méthode suivante ne pose pas de problème:
(Reel est float et je suis sous CodeBlocks)

Point3D Point3D::operator* (const Reel &lambda);

mais comme il est plus naturel de multiplier un
nombre par un vecteur (je confonds point et vecteur),
j'ai écrit la fonction globale:

Point3D operator* (const Reel &lambda, const Point3D &p)
{ // renvoie lambda * *this
return p * lambda;
}

qui ne compile pas, alors que:

Point3D operator* (const Reel &lambda, const Point3D &p)
{ // renvoie lambda * *this
Point3D tmp = p;
return tmp * lambda;
}

fonctionne correctement.

J'ai le même problème avec la surcharge du chevron sortant:

ostream &operator<< (ostream &out, const Point3D &p)
{
Point3D tmp = p;
tmp.afficher(out);

return out;
}

fonctionne correctement, alors que:

ostream &operator<< (ostream &out, const Point3D &p)
{
p.afficher(out);

return out;
}

ne compile pas, le prototype de afficher étant:

void Point3D::afficher(ostream &out);

Qu'est ce qui se passe ?

--

Etienne

4 réponses

Avatar
Mickaël Wolff
Etienne Rousee a écrit :

Qu'est ce qui se passe ?



Quel est le message d'erreur ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position <http://lupusmic.org/pro/>
Avatar
Etienne Rousee
Mickaël Wolff a écrit :
> Etienne Rousee a écrit :
>
>> Qu'est ce qui se passe ?
>
> Quel est le message d'erreur ?

passing 'const Point3D' as 'this' argument of
'Point3D Point3D::operator*(const Reel&)'
discards qualifiers

Pardon de t'avoir d'abord répondu directement,
c'est une fausse manoeuvre.

--

Etienne
Avatar
Jean-Marc Bourguet
Etienne Rousee writes:

Mickaël Wolff a écrit :
Etienne Rousee a écrit :

Qu'est ce qui se passe ?



Quel est le message d'erreur ?



passing 'const Point3D' as 'this' argument of
'Point3D Point3D::operator*(const Reel&)'
discards qualifiers

Pardon de t'avoir d'abord répondu directement,
c'est une fausse manoeuvre.



Mets ton opérateur

Point3D Point3D::operator*(const Reel&)

const

Donc déclare et défini-le comme

Point3D operator*(const Reel&) const

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
James Kanze
On Feb 8, 7:17 pm, Etienne Rousee wrote:

J'ai une classe Point3D et quelques problèmes
avec surcharge d'opérateurs, const et références.



J'ai une classe Point3D tout à fait classique.



la méthode suivante ne pose pas de problème:
(Reel est float et je suis sous CodeBlocks)



Point3D Point3D::operator* (const Reel &lambda);



Il ne manquerait pas un const ? Une fonction operator* ne doit
pas modifier l'objet, à mon avis.

mais comme il est plus naturel de multiplier un nombre par un
vecteur (je confonds point et vecteur), j'ai écrit la fonction
globale:



Point3D operator* (const Reel &lambda, const Point3D &p)
{ // renvoie lambda * *this
return p * lambda;
}



qui ne compile pas,



Parse que Point3D::operator* n'est pas const, et donc ne peut
pas être appelée sur un Point3D const.

alors que:



Point3D operator* (const Reel &lambda, const Point3D &p)
{ // renvoie lambda * *this
Point3D tmp = p;
return tmp * lambda;
}



fonctionne correctement.



Parce que tmp n'est pas const.

J'ai le même problème avec la surcharge du chevron sortant:



ostream &operator<< (ostream &out, const Point3D &p)
{
Point3D tmp = p;
tmp.afficher(out);



return out;
}



fonctionne correctement, alors que:



ostream &operator<< (ostream &out, const Point3D &p)
{
p.afficher(out);

return out;
}



ne compile pas, le prototype de afficher étant:



void Point3D::afficher(ostream &out);



De nouveau : elle doit sans doute être const :

void Point3D::afficher( ostream& out ) const ;

Qu'est ce qui se passe ?



Il te manque des const.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34