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 d' operateur


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut surcharge d' operateur
    bonjour j"aimerais faire le somme de deux vecteurs en utilisant une surcherge d'operateur en C++ voici ma methode
    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
     
    vecteur vecteur::operator+(const vecteur& vecter)
      { int i;
          int *tabl;
          tabl=new int[Nblignes];
     
        //les valeurs de vecteur1 sont chargés dans tabl
     
          for(i=0;i<Nblignes;i++)
          {
            tabl[i]=tab[i];
          }
     
        // somme des elements de tabl et vecteur2
          for(i=0;i<Nblignes;i++)
          {
            tabl[i]=vecter.tab[i];
          }
     
        //Création d'un type de retour
           vecteur resultat (*tabl);
     //retour du resulatt
           return resultat; 
      }
    je sais pas si elle est correcte

    l'instruction qui appele cette methode est

    resultat=vecteur1+vecteur2;

    quand je compile j'ai cette unique erreur

    invalid operands of types `vecteur*' and `vecteur*' to binary `operator+'

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pourrait-on avoir la définition de ta classe vecteur, et l'implémentation de tes différents constructeurs

    Ceci dit, il y a une ligne qui m'intrigue au plus haut point... c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vecteur resultat (*tabl);
    En effet, tu prend la peine de créer un tableau et de le remplir, tout cela pour... ne transmettre que le premier élément du tableau au constructeur de ta classe...

    Cherchez l'erreur
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut fichier.h
    voici mon fichier.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 _VECTEUR_H_
    #define _VECTEUR_H_
    #define min  1
    #define max  100
    class vecteur
     
    {
       int Nblignes ;
       int *tab;
      //tab=new int[Nblignes];
     
       public:
        vecteur(int n);
        void lire();
        void afficher();
        vecteur operator+(const vecteur &vecter);
     
     
        ~vecteur();
    };
    #endif
    Mon fichier .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
     
    #include <iostream>
    #include "vecteur.h"
    using namespace std;
     
     
    vecteur:: vecteur (int n)
     { int i;
      cout<<"\n\n Construction du vecteur \n";
     
        do
        { if ((n < min)||(n > max))
           { 
             cout <<" \n\n le nombre d'elements du vecteur doit etre compri entre "<<min <<" et " <<max;
             cout << "\n \nVeuillez recommencer \n";
             cout << "\n \nNombre d elements du vecteur ";
             cin>>n;
           }
        }while((n<min)||(n>max));
     
         cout <<" \n\nle nombre d'elements du vecteur est : "<<n<<"\n";
     
        tab=new int[n];
     
          for(i=0;i<n;i++)
          tab[i]=0;
     
         for(i=0;i<n;i++)
         cout <<" \n\nl element " <<i+1 <<" du vecteur est : " <<tab[i]<<"\n";
       }
     
       void  vecteur::lire()
       { int i;
             cout << "\n \n Entrer le nombre de lignes  du vecteur\n\n ";
             cin>>Nblignes;
         tab=new int[Nblignes];
             for(i=0;i<Nblignes;i++)
              {
                cout<< "\n \n Entrer l element " << i+1<< "  du vecteur\n\n ";
                cin>>tab[i];
             }
       }
     
       void vecteur::afficher()       
       { 
         int i;
            for(i=0;i<Nblignes;i++)
            cout <<" \n\nl element " <<i+1 <<" du vecteur est : " <<tab[i]<<"\n";
       }
     
    vecteur vecteur::operator+(const vecteur& vecter)
      { int i;
          int *tabl;
          tabl=new int[Nblignes];
     
        //les valeurs de vecteur1 sont chargés dans tabl
     
          for(i=0;i<Nblignes;i++)
          {
            tabl[i]=tab[i];
          }
     
        // somme des elements de tabl et vecteur2
          for(i=0;i<Nblignes;i++)
          {
            tabl[i]=vecter.tab[i];
          }
     
        //Création d'un type de retour
    vecteur resultat (*tabl);
     //retour du resulatt
    return resultat; 
      }
     
    vecteur:: ~vecteur ()
     {
        cout<<"\n\n Destruction du vecteur \n";       
      }
    Mon prog principal

    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
     
    #include <iostream>
    #include "vecteur.h"
    using namespace std;
     
    main()
     
     {
       vecteur *vecteur1=new vecteur(3);
     
       vecteur1->lire();
       vecteur1->afficher();
     
       vecteur *vecteur2=new vecteur(3);
     
       vecteur2->lire();
       vecteur2->afficher();
       vecteur *resultat=new vecteur(3);
     
       resultat=vecteur1+vecteur2;
       delete vecteur1;
     }

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    oui, ben, c'est encore pis que ce que j'aurais pu penser...

    Reprends, si tu veux bien, ta logique pour réfléchir trente secondes...

    Dans ton opérateur, tu:
    crée un tableau dynamique
    1. le rempli avec les éléments du tableau courent
    2. additionne les valeurs du nouveau tableau une à une avec celles du tableau de l'élément passé en paramètre, jusqu'ici, tout va très bien... mais après
    3. tu passe le premier élément de ce tableau au constructeur de ta classe vecteur qui... le considère comme... le nombre d'élément à allouer au tableau...
    Heuu... ca te semble logique

    N'a tu pas un tout petit peu l'impression qu'il y a comme qui dirait un problème
    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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    3. tu passe le premier élément de ce tableau au constructeur de ta classe vecteur qui... le considère comme... le nombre d'élément à allouer au tableau...
    je vois pas laquelle de mes instructions le fait

    Apres l'addition je crée un type de retour (resultat) et je j'utilise pour retourner le tableau à partir du pointeur vers le premier element

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    euh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i;
          int *tabl;
          tabl=new int[Nblignes];
          
        //les valeurs de vecteur1 sont chargés dans tabl
        
          for(i=0;i<Nblignes;i++)
          {
            tabl[i]=tab[i];
          }
    N'a aucun interêt, sauf si tu veux modifier tab... mais dans un operator + les deux membres doivent être constant.
    De plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0;i<Nblignes;i++)
          {
            tabl[i]=vecter.tab[i];
          }
    ça veut dire que tabl[] = vecter.tab[].... alors pourquoi l'avoir remplis avant avec le membre de droite? tu l'efface avec le membre de gauche...
    Et selon ton code tu devrais retourné vecteur v(NbLignes + vecter.GetNbLignes()).. car effectivement tu ne revois jamais de pointeur... le type de ta fonction est vecteur... tu doit retourné une copie.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par patricx Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    3. tu passe le premier élément de ce tableau au constructeur de ta classe vecteur qui... le considère comme... le nombre d'élément à allouer au tableau...
    je vois pas laquelle de mes instructions le fait

    Apres l'addition je crée un type de retour (resultat) et je j'utilise pour retourner le tableau à partir du pointeur vers le premier element
    Oui, mais réfléchis un peu à ce que fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau resultat(*tabl);
    *tabl indique que tu transmet au constructeur... ce qui est pointé par le pointeur nommé tabl...

    En l'occurence, il s'agit... du premier élément du tableau (cela revient strictement au même que si tu avais utilisé tabl[0])...

    Ce premier élément de tabl, tu le transmet au constructeur de ta classe Vecteur, dans lequel on lit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vecteur:: vecteur (int n)
    {
        if ((n < min)||(n > max))
            cout <<" \n\n le nombre d'elements du vecteur doit etre compri entre "<<min <<" et " <<max;
    qui nous ramènent aux directives préprocesseurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define min  1
    #define max  100
    ... C'est quand même pas moi qui l'ai inventé, ce code là

    Tu vois donc bien que ta ligne Vecteur resultat (*tabl) transmet le premier élément du tableau comme... nombre d'élément au constructeur de ta classe vecteur...

    CQFD...
    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

Discussions similaires

  1. est ce possible de surcharger les operateurs
    Par dietrich dans le forum Delphi
    Réponses: 5
    Dernier message: 26/08/2006, 11h15
  2. Surcharge d operateur ==
    Par flipper203 dans le forum C++
    Réponses: 15
    Dernier message: 05/07/2006, 01h54
  3. [POO] surcharge d'operateur
    Par wamania dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 14h31
  4. surcharge des operateurs de flux
    Par icer dans le forum C++
    Réponses: 6
    Dernier message: 22/02/2006, 09h02
  5. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44

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