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 :

surcharge+ et retour valeur


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut surcharge+ et retour valeur
    Bonjours, j'ai un problème leur d'un retour de valeur quand je surcharge l'opérateur+.

    Voilà mes fichier

    Entier.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
    23
    24
    25
    26
    27
    28
    29
    30
     
    #ifndef _ENTIER_H
        #define _ENTIER_H
     
        class entier
        {
            public:
                /* Constructeur et Destructeur */
                entier();
                entier(unsigned int);
                ~entier();
     
                /* Operateurs + surchargés */
                entier& operator++(int);
                entier& operator++();
                entier& operator+=(const entier &);
                entier operator+(const entier &);
     
                /* Méthode générales d'accès */
     
                void afficher() const ;
                int eniemeValeur(int i) const ;
     
            private:
                int *pTabEntier;
                entier(int *);
                void miseEnForme();
        };
     
    #endif
    main.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
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <iostream>
    #include "Entier.h"
     
     
    using namespace std;
     
    const short int TailleTableau = 3;
     
    entier::entier()
        :pTabEntier(new  int[TailleTableau]) {
            for(int i=0;i<TailleTableau;i++)
                pTabEntier[i] = 0;
    }
     
    entier::entier(unsigned int ValeurDepart)
        :pTabEntier(new int[TailleTableau]) {
            for(int i=0;i<TailleTableau;i++) {
                pTabEntier[i] = 0;
            }
            pTabEntier[TailleTableau-1] = ValeurDepart;
            miseEnForme();
    }
     
    entier::entier(int *ValeurDepart)
        :pTabEntier(new int[TailleTableau]) {
            for(int i=0;i<TailleTableau;i++) {
                    pTabEntier[i] = ValeurDepart[i];
            }
    }
     
    entier::~entier() {
            delete[] pTabEntier;
    }
     
    entier& entier::operator++(int) {
            pTabEntier[TailleTableau-1] +=1;
            miseEnForme();
            return *this;
    }
     
    entier& entier::operator++() {
            pTabEntier[TailleTableau-1] +=1;
            miseEnForme();
            return *this;
    }
     
    entier& entier::operator+=(const entier &rhs) {
        for(int i=0;i<TailleTableau;i++) {
            pTabEntier[i] += rhs.eniemeValeur(i);
        }
        miseEnForme();
        return *this;
    }
     
    entier entier::operator+(const entier &rhs) {
        entier Copy(pTabEntier);
        return entier( Copy += rhs );
    }
     
    int entier::eniemeValeur(int i) const {
        return pTabEntier[i];
    }
     
    void entier::afficher() const {
            for(int i = 0;i<TailleTableau;i++) {
                cout << pTabEntier[i] ;
                if( ((i+1)%6) == 0) {
                     cout << " " ;
                }
            }
    }
     
    void entier::miseEnForme() {
        for(int i=TailleTableau-1;i>=0;i--) {
            if(pTabEntier[i] >= 10 && i!=0 ) {
                pTabEntier[i-1] += pTabEntier[i] / 10 ;
                 pTabEntier[i] =  pTabEntier[i] % 10 ;
            }
            else if( i==0 &&  pTabEntier[i] >= 10 ) {
                pTabEntier[0]=0;
                for(int j=0;j<(TailleTableau-1) && pTabEntier[j]!=0;j++) {
                    pTabEntier[j]=0;
                }
                i=TailleTableau;
            }
        }
    }
     
    int main()
    {
        entier a(200),b(5),c(1);
        c = a + b;
        a.afficher() ;cout << endl << endl;
        b.afficher() ;cout << endl << endl;
        c.afficher() ;cout << endl << endl;
     
        return 0;
    }
    si je fait , a+= b, j'obtient le bon résultat, pareil si je fait a++ ou ++a.
    Mais si je fait par exemple :
    c = a + b avec a=200 et b = 5 c = 400719605

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu n'as pas surchargé l'opérateur '='.
    L'itération est humaine; la récursion, divine.

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    J'ai survolé mais je n'ai pas vu d'opérateur d'affectation ?!!

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    comment ca ? je suis obligé de surcharger l'opérateur = aussi pour que le + fonctionne.

    De plus si je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (a+b).afficher() // me retourne 005

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Oui = est un opérateur comme les autres spécifique aux types de données qu'il traite.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    Vous pouvez me montré un exmple pour surcharger mon opérateur +, car la rien ne marche :s...

  7. #7
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Ce n'est pas l'opérateur + qui ne vas pas. C'est l'opérateur =.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entier & operator = (const entier &) throw ();
    Attention, il renvoie une référence !

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    Voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    entier& entier::operator= (const entier &rhs) {
    for(int i=0;i<TailleTableau;i++) {
    pTabEntier[i] = rhs.eniemeValeur(i);
    }
    return *this;
    }
    je viens de surchargé mon =.

    Je voulais aussi savoir, dans mon bouqin de programmation il ne surcharge que l'opérateur + et il ne font pas le =.
    Et pourtant il obtienne le bon résultat. Est que ceci est normal ?

  9. #9
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Je voulais aussi savoir, dans mon bouqin de programmation il ne surcharge que l'opérateur + et il ne font pas le =.
    Et pourtant il obtienne le bon résultat. Est que ceci est normal ?
    Normalement non !!!

    C'est quoi ton bouquin ?

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    le langage C++ édition CampusPress de Jesse Liberty et Bradley Jones

  11. #11
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Bizarre quand même !

    C'est la même classe que toi ?

    PS : pense à mettre Résolu ^^

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    MERCi

    Leur exemple :

    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
     
     
    class Counter {
       public :
          Counter();
          Counter(int initialValue);
          ~Counter();
     
          int GetItsValue() { return itsval; }
          Counter operator+ (const Counter &);
       private :
          int itsVal;
    };
     
    ....
     
    Counter Counter::operator+(const Counter &rhs) {
     return Counter(itsVal + rhs.GetItsValue());
    }
    et heu obtenait les bon résultat....

  13. #13
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Ici, leur exemple ne comprend qu'une seule donnée membre qui est un int.

    La SL connait tous les opérateurs qui dépendent sur les ints ! Donc pas besoin de surcharger

  14. #14
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par maminova77
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    entier& entier::operator++(int) {
            pTabEntier[TailleTableau-1] +=1;
            miseEnForme();
            return *this;
    }
    Il me semble que l'operateur d'incrémentation suffixe doit retourner une valeur et pas une refference.

  15. #15
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Effectivement !!

    D'ailleur tes opérateurs de post/pré-incrémentation sont les même, alors que il doivent renvoyer des valeurs différentes !

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

Discussions similaires

  1. [MySQL] Retour valeur case à cocher depuis une base de données
    Par asvin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/10/2008, 19h25
  2. retour valeur après évenement onChange
    Par dragonfly80 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/09/2008, 21h07
  3. Réponses: 3
    Dernier message: 12/05/2008, 09h10
  4. Probleme retour valeur recordset
    Par Access Newbie dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/07/2007, 11h37
  5. [PHP-JS] retour valeur javaScript dans php
    Par Tempotpo dans le forum Langage
    Réponses: 6
    Dernier message: 06/04/2006, 11h35

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