Partage

surcharge d'opérateur

Sujet résolu
17 mai 2018 à 10:27:34

Bonjour je cherche à créer un opérateur == non membre dans la classe suivante :

#ifndef point_H
#define point_H

class point{
 public :
  point();
  point(double a, double b) ;
  void set_point(double a, double b);
  double get_mx();
  double get_my();
  void set_mx(double a);
  void set_my(double a) ;
  void print() ; 
  bool operator==(point const& m1) ;
 
  private :
  double mx;
  double my ;
};

bool operator==(point const& m1, point const& m2) ;


#endif


je la déclare comme ceci dans le .cc :
bool point::operator==(point const& m1, point const& m2) 
{
  if ( m1.get_mx() == m2.get_mx() && m1.get_my()== m2.get_my())
     return true ;
  else
      return  false ;
}


or bien qu'il me semble avoir respecté les exemples donné dans le cours sur les surcharges d'opérateur, le terminal me renvoie ça ;

point.cc:128:18: erreur: passing ‘const point’ as ‘this’ argument of ‘double point::get_mx()’ discards qualifiers [-fpermissive]
   if ( m1.get_mx() == m2.get_mx() && m1.get_my() == m2.get_my())
                  ^
point.cc:128:32: erreur: passing ‘const point’ as ‘this’ argument of ‘double point::get_mx()’ discards qualifiers [-fpermissive]
   if ( m1.get_mx() == m2.get_mx() && m1.get_my() == m2.get_my())
                                ^
point.cc:128:47: erreur: passing ‘const point’ as ‘this’ argument of ‘double point::get_my()’ discards qualifiers [-fpermissive]
   if ( m1.get_mx() == m2.get_mx() && m1.get_my() == m2.get_my())
                                               ^
point.cc:128:62: erreur: passing ‘const point’ as ‘this’ argument of ‘double point::get_my()’ discards qualifiers [-fpermissive]
   if ( m1.get_mx() == m2.get_mx() && m1.get_my() == m2.get_my())
                                                              ^
point.cc:128:20: erreur: lvalue required as left operand of assignment
   if ( m1.get_mx() == m2.get_mx() && m1.get_my() == m2.get_my())
                    ^



-
Edité par valgwi 17 mai 2018 à 10:28:08

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
17 mai 2018 à 10:39:23

Yo!
bool point::operator==(point const& m1, point const& m2)
Tes arguments sont const. Hors ta fonction get_mx() et get_my() ne sont pas déclarés comme const. Tu ne peux pas appelé des arguments pas const dans une fonction const. (Il me semble que c'est ça)
"Le fossé séparant théorie et pratique est moins large en théorie qu’il ne l’est en pratique"
17 mai 2018 à 10:58:53

effectivement, si je remplace le point const& par point& ça marche bcp mieux. Merci !
17 mai 2018 à 11:07:38

Mais tu devrais peut-être suivre la const correctness et mettre ta fonction en const plutôt que d'enlever les const
"Le fossé séparant théorie et pratique est moins large en théorie qu’il ne l’est en pratique"
17 mai 2018 à 11:40:50


bool point::operator==(point const& m1, point const& m2)

Tes arguments sont const. Hors ta fonction get_mx() et get_my() ne sont pas déclarés comme const. Tu ne peux pas appelé des arguments pas const dans une fonction const. (Il me semble que c'est ça)


Ceci déclare une opération à 3 paramètres. Il faut virer le premier "point::".

La définition idéale, c'est friend (pour des histoire de résolution de noms) et libre (pour des histoires de symétrie).

PS: mais pourquoi des setters ? Crois-tu vraiment en avoir besoin quand tu as déjà un constructeur à paramètres ?
PPS: pas besoin de "if(expr) return true else return false" quand "return expr" suffit!

C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
17 mai 2018 à 13:22:56

Salut,

Il est vrai que je ne comprends pas vraiment:

bool operator==(point const& m1, point const& m2) ;

ni la définition dans ton ".cc". 

Dans ta classe, tu as le prototype suivant : 

bool operator==(point const& m1) ;

qui est le prototype d'une surcharge de l'opérator == binaire par méthode ( ex: a==b  .... binaire car tu as un paramètre (a) représenté par ton this, et un autre paramètre (b) qui est point const& m1).   

Si tu souhaites surcharger ton opérateur par fonction, ta fonction n'ayant pas de this, il y aura donc deux paramètres dans le prototype (a et b). Le prototype sera donc : 

friend bool operator==(point const& m1, point const& m2) ;

Friend -> lmghs vient de te donner la raison principale. 



-
Edité par Didy7 17 mai 2018 à 13:24:14

Didy7 -
17 mai 2018 à 13:29:13

Et pour faire les surcharges de manière idiomatique, consulter http://en.cppreference.com/w/cpp/language/operators .

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

surcharge d'opérateur

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown