Partage
  • Partager sur Facebook
  • Partager sur Twitter

surcharge d’opérateur ==

surcharge d’opérateur ==

    17 mai 2019 à 0:23:08

    Bonsoir à tous ,

    je suis debutant en c++ et je lis en appliquant tout doucement le cour.

    j'aimerai comprendre la surcharge d’opérateur (==) sur cette page : https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c/1897891-surchargez-un-operateur

    mais ma console affiche une erreur , j'essaie de comprendre le fond du problème mais j'y arrive pas , pourtant on doit respecter le principe d'encapsulation.

    vous pouvez voir ma classe Duree.h dans l'image.
    voici ma classe Duree.cpp comme l'indique le cour
    #include "Duree.h"
    
    Duree::Duree(int heures, int minutes, int secondes) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
    {
    }
    bool operator==(Duree const& a, Duree const& b)
    {
       return (a.m_heures == b.m_heures && a.m_minutes == b.m_minutes && a.m_secondes == b.m_secondes);
    }
    
    pouvez vous m'eclaissir svp....
    merci

    -
    Edité par alinftu 17 mai 2019 à 0:25:35

    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2019 à 0:57:30

      Salut,

      Soit tu déclares un operator== dans ta classe (qui prendra donc un argument comme te dit ton compilateur), soit tu le déclares hors de ta classe.

      La tu as fais un mix des deux, donc met la déclaration hors de ta classe et c'est bon :)

      -
      Edité par ads00 17 mai 2019 à 0:58:21

      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2019 à 1:15:34

        merci ads00 pour ta réaction , 

        je préfère déclarer dans ma classe avec un argument comme ceci :

        bool operator==(Duree const& a); 

        dans ce cas j'ai plus d'erreur.

        mais j'ai une question o_O

        pourquoi le declarer avec uniquement un parametre alors que dans le fichier .cpp la methode attend deux parametres ?

        bool operator==(Duree const& a, Duree const& b)
        {
           return (a.m_heures == b.m_heures && a.m_minutes == b.m_minutes && a.m_secondes == b.m_secondes);
        }
        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2019 à 2:01:13

          > je préfère déclarer dans ma classe avec un argument comme ceci : [...]

          Les opérateurs de comparaison devraient toujours être const: bool operator==(Duree const& a) const;

          Mais un opérateur en membre empêche toute conversion implicite du paramètre gauche: maduree == {1, 2, 34} va fonctionner, mais pas {1, 2, 34} == maduree. La fonction libre permet les 2 formes et est souvent préférable.

          https://en.cppreference.com/w/cpp/language/operator_comparison

          > pourquoi le declarer avec uniquement un parametre alors que dans le fichier .cpp la methode attend deux parametres ?

          C'est toi qui as voulu mettre la fonction en membre. Donc c'est à toi d'être cohérent et d'avoir le même prototype dans le .h et le .cpp. Le "cours" utilise la forme libre.

          En parlant du "cours", tu devrais t'en débarrasser. Il est vieux, complètement dépassé, contient de nombreuses erreurs et présente des choses qui ne devraient jamais être utilisées aujourd'hui. Tourne-toi plutôt vers le cours de Zeste de Savoir ou le livre C++ Primer de Lippman dans sa dernière édition (en anglais).

          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2019 à 2:40:13

            ok je vois , l'alerte est importante , moi qui fonçais tête baisser :o ,

            Zeste de Savoir est le mieux indiqué pour moi mais je travaillerais en parallèle.

            Vu que le projet cible n'a pas été fait ressemant , le cour de ce site sur le c++ pourra m'apporter un plus.

            merci jo_link_noir 

            • Partager sur Facebook
            • Partager sur Twitter

            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