IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème lors de la comparaison entre deux objets C++


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2021
    Messages : 1
    Par défaut Problème lors de la comparaison entre deux objets C++
    Bonjour à tous,

    Je suis actuellement en train d'apprendre le C++ et après de nombreuses heures à chercher, je vous demande de l'aide...

    Pour résumer, je chercher à comparer deux objets appartenant à la même classe "Duree" afin de verifier si les deux durées identiques.

    Contenu du fichier Duree.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #ifndef DEF_DUREE
    #define DEF_DUREE
     
    class Duree
    {
    public:
    	// Constructeur de la classe
    	Duree(int heures = 0, int minutes = 0, int secondes = 0);
     
    	// Opérateur de comparaison pour vérifier que les deux objets de la classe Duree sont égaux avec le symbole "=="
    	bool operator==(Duree const& a, Duree const& b);
            bool Duree::estEgal(Duree const& b) const;
     
     
    	private:
     
    	int m_heures;
    	int m_minutes;
    	int m_secondes;
    };
     
    #endif
    Contenu du fichier Duree.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include "Duree.h"
     
    using namespace std;
     
    // Constructeur de la classe Duree
    Duree :: Duree(int heures, int minutes, int secondes) : m_heures(heures), m_minutes(minutes), m_secondes(secondes) {
    }
     
    // Opérateur de comparaison pour vérifier que les deux objets de la classe Duree sont égaux avec le symbole "=="
    bool operator==(Duree const& a, Duree const& b) {
    	return a.estEgal(b);
    }
     
    bool Duree::estEgal(Duree const& b) const {
    	//Teste si a.m_heure == b.m_heure etc.  
    	return (m_heures == b.m_heures && m_minutes == b.m_minutes && m_secondes == b.m_secondes);
    }
    Contenu main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "Duree.h"
     
    int main() {
    	Duree duree1(0, 10, 28), duree2(0, 10, 28);
     
    	if (duree1 == duree2)
    		cout << "Les durees sont identiques";
    	else
    		cout << "Les durees sont differentes";
     
    	return 0;
    }
    Et quand je compile mon projet, j'obtiens cette erreur :
    /usr/bin/g++ -c "/home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/Duree.cpp" -g -O0 -Wall -o ./Debug/Duree.cpp.o -I. -I.
    /usr/bin/g++ -c "/home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/main.cpp" -g -O0 -Wall -o ./Debug/main.cpp.o -I. -I.
    In file included from /home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/main.cpp:1:
    /home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/Duree.h:11:48: error: 'bool Duree::operator==(const Duree&, const Duree&)' must have exactly one argument
    bool operator==(Duree const& a, Duree const& b);

    In file included from /home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/Duree.cpp:1:
    /home/djaws/Projects/OpenClassRooms/OpenClassRooms/OpenClassRooms/Duree.h:11:48: error: 'bool Duree::operator==(const Duree&, const Duree&)' must have exactly one argument
    bool operator==(Duree const& a, Duree const& b);
    J'espère que vous verrez s'il y a problème dans mon code, si vous avez besoin de plus d'infos je reste à votre disposition

    Djaws

    "I like being weird. Weird's all i've got.
    That, and my sweet style" - Maurice Moss.

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 602
    Par défaut Dure durée
    Bonjour,

    Comme ce n'est pas une déclaration globale de l'opérateur, le compilateur préfère :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool operator==(const Duree & d);          // dans la déclaration de la classe.hpp
     
    bool Duree::operator==(const Duree & d) {  // dans l'implémentation de la class .cpp
    }

    Le premier argument est de facto l'instance de l'objet appelant, il est à comparer au second (ici d). Comme le compilateur l'indique, la fonction n'a qu'un seul argument.

    Par ailleurs le code ne fonctionnera pas correctement : par exemple Duree(1, 0, 0) sera considéré comme != Duree(0, 60, 0) qui est autorisée par l'initialisation mais non renormalisé. Il pourrait être préférable de travailler avec un stockage int32_t ou int64_t, par exemple int32_t dt = ((heures * 60) + minutes)*60 + secondes et une fonction d'affichage.

    Salutations

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Pour définir l'opérateur == entre 2 Duree, tu as plusieurs possibilités:
    - ça peut être une fonction membre à un seul paramètre (l'autre c'est l'objet courant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         bool  operator==( Duree const& b )const;
    - ça peut être une fonction amie avec 2 paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         friend bool  operator==( Duree const& a, Duree const& b );
    - ça peut être une fonction libre, donc à déclarer à l'extérieur de la classe Duree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool  operator==( Duree const& a, Duree const& b );
    - ça peut aussi utiliser l'opérateur "spaceship" <=> (c'est dans le C++20, mais ton cours s'est arrêté avant le C++98.), ça définit en une seule fois == != < <= > >=, je ne m'y arrête pas ici.

    Ensuite tu peux définir le corps de la fonction dans un fichier source par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool  Duree::operator==( Duree const& b )const { ...... }     // 1er cas
    bool  operator==( Duree const& a, Duree const& b ) { ...... } // 2nd ou 3ième cas
    Tu peux aussi définir les cas comme étant inline. Dans ce cas le corp de la fonction est dans le fichier entête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         bool  operator==( Duree const& b )const { ...... }
         friend bool  operator==( Duree const& a, Duree const& b ) { ...... }
    inline bool  operator==( Duree const& a, Duree const& b ) { ...... }
    S'il fallait en préférer une, ça serait la fonction amie et inline, c'est celle qui te donnera le meilleur "Argument Dependant Lookup", concept à voir plus tard.

    Mais qu'as-tu écris dans ta class Duree? Ça ne correspond à aucun des 3 cas possibles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison entre deux images: problème de luminosité.
    Par nadour dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 25/03/2014, 11h01
  2. Problème lors q'une comparaison entre 2 valeurs
    Par Xenonmax dans le forum Android
    Réponses: 2
    Dernier message: 15/11/2011, 14h17
  3. Réponses: 6
    Dernier message: 18/04/2006, 13h11
  4. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 20h53
  5. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo