Partage
  • Partager sur Facebook
  • Partager sur Twitter

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

    • Partager sur Facebook
    • Partager sur Twitter
      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)
      • Partager sur Facebook
      • Partager sur Twitter

      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
      D. Mendeleïev

        17 mai 2018 à 10:58:53

        effectivement, si je remplace le point const& par point& ça marche bcp mieux. Merci !
        • Partager sur Facebook
        • Partager sur Twitter
          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
          • Partager sur Facebook
          • Partager sur Twitter

          « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
          D. Mendeleïev

            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!

            • Partager sur Facebook
            • Partager sur Twitter
            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

              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2018 à 13:29:13

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

                • Partager sur Facebook
                • Partager sur Twitter

                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é.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown