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 :

Programme surcharge opérateurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut Programme surcharge opérateurs
    Bonjour, j'ai un petit soucis dans mon programme 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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #include <conio.h>
    #include <iostream>
     
    using namespace std;
     
    class chaine
    {
          private :
                  int longueur;
                  char *adr;
          public :
                 chaine();
                 chaine(char *texte);
                 void operator =(chaine &ch);
                 int operator ==(chaine ch);
                 chaine &operator +(chaine ch);
                 char &operator [](int i);
                 ~chaine();
                 void affiche();
    };
     
    chaine::chaine()      //constructeur1
    {
                          longueur=0;
                          adr = new char[1];
    }
     
    chaine::chaine(char *texte)     //constructeur2
    {
                        int i;
                        for(i=0; texte[i]!='\0'; i++);
                        longueur = i;
                        adr = new char[longueur+1];
                        for(i=0; i!=(longueur+1); i++) adr[i] = texte[i];
    }
     
     
    void chaine::operator =(chaine &ch)
    {
         delete adr;
         longueur = ch.longueur;
         adr = new char[ch.longueur+1];
         for(int i=0; i!=(longueur+1); i++) adr[i] = ch.adr[i];
    }
     
    int chaine::operator ==(chaine ch)
    {
        int i, res=1;
        for(i=0; (i!=(longueur+1))&&(res!=0); i++) if(adr[i]!=ch.adr[i]) res=0;
        return res;
    }
     
    chaine &chaine::operator +(chaine ch)
    {
           int i;
           static chaine res;
           res.longueur = longueur + ch.longueur;
           res.adr = new char[res.longueur+1];
           for(i=0; i!=longueur; i++) res.adr[i] = adr[i];
           for(i=0; i!=ch.longueur; i++) res.adr[i+longueur] = ch.adr[i];
           res.adr[res.longueur]='\0';
           return res;
    }
     
    char &chaine::operator [](int i)
    {
         static char res='\0';
         if(longueur!=0) res= *(adr+i);
         return res;
    }
     
    chaine::~chaine()
    {
                     delete adr;
    }
     
    void chaine::affiche()
    {
         int i;
         for(i=0; i!=longueur; i++) cout << adr[i];
    }
     
    int main()
    {
         chaine a("Bonjour "),b("Maria"),c,d("Bonjour "),e;
     
         if(a==b) cout << "Gagne !\n";
         else cout << "Perdu !\n";
         if(a==d) cout << "Gagne !\n";
         else cout << "Perdu !\n";
         cout << "a: ";
         a.affiche();
         cout << "b: ";
         b.affiche();
         cout << "d: ";
         d.affiche();
         c = a+b;
         cout << "c: ";
         c.affiche();
     
         for(int i=0 ; c[i]!='\0' ; i++) cout << c[i];
         getch();
    }
    Celui ci m'affiche comme réponse :

    Perdu !
    Gagne !
    a: Bonjour b: x►L ─d: á►L Þ☼L c: Bonjour x►L ─Bonjour x►L

    Merci d'avance pour votre aide. Cordialement

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    C'est un problème classique lorsqu'on manipule des pointeurs nus. Tu as un constructeur par copie implicite qui est généré et qui ne copie pas en profondeur ton pointeur. Donc celui-ci va être libéré plusieurs fois, d'où toutes ces erreurs.
    Mais, vu le code, j'aurais tendance à poser une question : es-tu en train d'apprendre le C++ tout seul avec un livre ? Ton code comporte beaucoup de problèmes et il me semble qu'il reste quelques lacunes sur les fondamentaux.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    En effet j'apprends tout seul. Si vous pouvez m'éclairer un peu plus car je n'ai pas tout compris votre réponse. Cordialement

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Réessaye sans les gagné/perdu ça va marcher !

    Pourquoi ? Parce que tu utilise le passage par copie, qui utilise le constructeur de copie de ta variable, qui se contente de bêtement recopier chaque champs.

    Du coup, lorsque la copie et détruite, et appelle le destructeur, elle appelle
    et là, c'est la cata : ton objet original pointes désormais sur un champs désalouer.

    Au passage, tu as de la chance que ça ne plante pas...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Oui en effet ça fonctionne mais je voudrais réussir à faire fonctionner le programme sans toucher à class chaine et void main()

  6. #6
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Comment veux-tu corriger un programme sans le modifier oO !?!

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

Discussions similaires

  1. Portabilitée : Surcharge opérateur de comparaison
    Par Dimitri_87 dans le forum C++
    Réponses: 11
    Dernier message: 15/12/2006, 16h14
  2. Surcharge opérateur +
    Par nunurs83 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2006, 09h48
  3. [Débutant]Surcharge opérateur +
    Par Geolem dans le forum Débuter
    Réponses: 13
    Dernier message: 05/12/2005, 10h16
  4. surcharge opérateur << et >>
    Par Azharis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2005, 21h22
  5. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51

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