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 Implémentation de surcharge de l’opérateur +


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Problème Implémentation de surcharge de l’opérateur +
    Salut, je suis debutant et j ai un petit soucis avec cet petit exemple d'implementation de surcharge d'operateur+. le code est le suivant:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #ifndef DUREE_H
    #define	DUREE_H
     
    class Duree {
     
    public:
        Duree(int heures , int minutes, int secondes);
        int GetSecondes() const;
        int GetMinutes() const;
        int GetHeures() const;
     
     
    private:
        int m_heures;
        int m_minutes;
        int m_secondes;
    };
     
    Duree operator+(Duree const& a, Duree const& b);
     
    #endif	/* DUREE_H */
     
     
    #include "Duree.h"
    using namespace std;
     
    Duree::Duree(int heures , int minutes, int secondes) {
     
        m_heures = heures;
        m_minutes = minutes;
        m_secondes = secondes;
     
    }
     
    int Duree::GetSecondes() const {
        return m_secondes;
    }
     
    int Duree::GetMinutes() const {
        return m_minutes;
    }
     
    int Duree::GetHeures() const {
        return m_heures;
    }
     
    Duree operator+(Duree const& a, Duree const& b)
    {
        Duree resultat; 
     
         resultat.GetHeures() = a.GetHeures() + b.GetHeures();
         resultat.GetMinutes() = a.GetMinutes() + b.GetMinutes();
         resultat.GetSecondes() = a.GetSecondes() + b.GetSecondes();
     
        return resultat;  
    }
     
     
     
    #include <iostream>
     
    #include "Duree.h"
     
    using namespace std;
     
    int main() {
     
        Duree duree1(0, 10, 28), duree2(0, 10, 28);
     
        Duree somme = duree1 + duree2;
     
         cout<< "la somme est:"<< somme.GetHeures()<<"h "<< somme.GetMinutes()<< "min "<< somme.GetSecondes()<< "sec"<< endl;
     
     
        return 0;
    }
    Mais le compilateur signale une erreur au niveau du fichier.cpp. Que faire?

    Merci d avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    indiquer l'erreur serait plus simple pour les intervenants.

    M'enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultat.GetHeures() = a.GetHeures() + b.GetHeures();
         resultat.GetMinutes() = a.GetMinutes() + b.GetMinutes();
         resultat.GetSecondes() = a.GetSecondes() + b.GetSecondes();
    Comprends-tu ce que tu écris ?
    Ces 3 lignes sont surement ton erreur et n'ont pas grand sens.
    GetXX comme son nom l'indique, retourne un entier, par copie.
    A quel moment crois-tu que ceci affecte une heure, minute ou seconde à ton objet durée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultat.m_heures = a.GetHeures() + b.GetHeures();
         resultat.m_minutes = a.GetMinutes() + b.GetMinutes();
         resultat.m_secondes = a.GetSecondes() + b.GetSecondes();
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Bonjour, j'ai essayé de modifier le code tel que Bousk me l'a conseillé, mais j obtiens toujours des erreurs de compilation entre la ligne 48 et 57:

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #ifndef DUREE_H
    #define	DUREE_H
     
    class Duree {
     
    public:
        Duree(int heures , int minutes, int secondes);
        int GetSecondes() const;
        int GetMinutes() const;
        int GetHeures() const;
     
     
    private:
        int m_heures;
        int m_minutes;
        int m_secondes;
    };
     
    Duree operator+(Duree const& a, Duree const& b);
     
    #endif	/* DUREE_H */
     
     
    #include "Duree.h"
    using namespace std;
     
    Duree::Duree(int heures , int minutes, int secondes) {
     
        m_heures = heures;
        m_minutes = minutes;
        m_secondes = secondes;
     
    }
     
    int Duree::GetSecondes() const {
        return m_secondes;
    }
     
    int Duree::GetMinutes() const {
        return m_minutes;
    }
     
    int Duree::GetHeures() const {
        return m_heures;
    }
     
    Duree operator+(Duree const& a, Duree const& b)
    {
        Duree resultat; 
     
         resultat.m_heures = a.GetHeures() + b.GetHeures();
         resultat.m_minutes = a.GetMinutes() + b.GetMinutes();
         resultat.m_secondes = a.GetSecondes() + b.GetSecondes();
     
        return resultat;  
    }
     
     
     
    #include <iostream>
     
    #include "Duree.h"
     
    using namespace std;
     
    int main() {
     
        Duree duree1(0, 10, 28), duree2(0, 10, 28);
     
        Duree somme = duree1 + duree2;
     
         cout<< "la somme est:"<< somme.GetHeures()<<"h "<< somme.GetMinutes()<< "min "<< somme.GetSecondes()<< "sec"<< endl;
     
     
        return 0;
    }

  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int GetSecondes() const;
    Ceci renvoit une copie de l'entier seconde.
    Lui affecter un nouveau nombre ne sera donc que temporaire. (Comme l'a expliqué Bousk).

    Retour par copie = const int getSecondes() const { return m_secondes; } (Bien penser a mettre le retour constant, cela peut eviter ce genre d'erreur.
    Retour par reference = int& getSecondes() { return m_secondes; } (La valeur retournée sera donc modifiable, faire attention avec son utilisation)

    Pour retourner l'objet lui même il faut donc soit passer le retour par reference non constante, soit utiliser un setter, ou encore le mieux a faire serait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Duree operator+(Duree const& a, Duree const& b)
    {
         int heures = a.GetHeures() + b.GetHeures();
         int minutes = a.GetMinutes() + b.GetMinutes();
         int secondes = a.GetSecondes() + b.GetSecondes();
         return Duree(heures, minutes, secondes);  
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Faudrait réfléchir 2s avant de copier/coller du code.
    Tes m_XX sont private, et ton operator+ n'est pas friend.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Je me suis fait tapper sur les doigts sur ce retour.
    Dans ce cas présent, il serait donc envisageable de mettre les operateurs directement dans la classe Durée non ?
    Car faire "1 + duree" n'aurait pas de sens !?

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Bien souvent, lorsqu l'on souhaite définir l'opérateur +, on a souvent également intérêt (ou besoin) de l'opérateur += qui affecte le résultat à la variable se trouvant à gauche de l'opérateur.

    En tous les cas, c'est très certainement le cas pour une classe devant représenter une durée, car il est fort vrai-semblable que tu aies un jour besoin d'écrire un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Duree total(0,0,0);
    std::vector<Duree> durees;
    /* remplicage du tableau */
    for(auto const & it : durees){ // C++11 inside :D
        total +=it;
    }
    une solution simple et efficace consiste alors à implémenter en priorité l'opérateur += qui affecte directement le résultat à l'opérande de gauche sous une forme proche de
    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
    23
    class Duree {
        public:
            /* ... */
        Duree & operator +=(Duree const & rhs){
            heures += rhs.getHeure();
            minutes += rhs.getMinute();
            secondes += rhs.getSeconde();
            /* max 60 secondes par minutes */
            if(secondes <=60){
                minutes ++;
                secondes -= 60;
            }
            /* max 60 minutes à l'heure */
            if(minutes <= 60){
                heures ++;
                minutes -=60;
            }
        }
        private:
            int heures;
            int minutes;
            int secondes;
    }
    Une fois que l'on a cet opérateur "d'addition affectation", l'opérateur d'addition "simple" (comprends : ne provoquant pas l'affectation du résultat à l'opérande de gauche) n'a "plus qu'à" l'utiliser sur une variable locale qu'il renverra par valeur sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Duree operator +(Duree const & lhs, Duree const & rhs){
        // on utilise une variable temporaire qui prend la valeur de l'opérande de gauche 
        Duree temp(lhs);
        // on additionne l'opérande de droite à la variable temporaire
        temp +=rhs;
        // on renvoie la variable temporaire qui correspond au résultat
        return temp;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Merci à vous pour vos réponses, j'ai pu enfin résoudre grâce à votre aide ce problème de surcharge d'opérateur +.

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

Discussions similaires

  1. [Problème] Héritage et surcharge
    Par kamykaze dans le forum C++
    Réponses: 8
    Dernier message: 13/11/2007, 14h18
  2. Réponses: 14
    Dernier message: 05/04/2007, 11h12
  3. Enorme problème de code surchargé pour ma GUI
    Par insomniak dans le forum C++
    Réponses: 26
    Dernier message: 23/12/2006, 17h35
  4. Réponses: 6
    Dernier message: 12/07/2006, 15h34
  5. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34

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