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 :

Erreur lors de surcharge d'opérateur


Sujet :

C++

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Erreur lors de surcharge d'opérateur
    Bonjour

    J'ai un petit problème avec la surcharge d'un opérateur.

    J'ai une structure Vector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Vector {
        private :
            double* tab;                                                      
            int nbComponent;                                                 
     
        public :
            Vector(int n) throw(std::invalid_argument);                                 
            Vector(const Vector& vector);                                               
            virtual ~Vector();  
            ...
    };
    Voici le prototype de la fonction operator* :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector operator * (double number, const Vector& vector);
    et voici sa définition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Vector operator * (double number, const Vector& vector) {
        Vector result(vector.getNbComponent());
     
        for (int i=0; i<vector.getNbComponent(); ++i) {
            result.setValue(i, number * vector.getValue(i));
        }
     
        return result;
    }
    Lors de la compilation, j'obtiens à la ligne de la déclaration du prototype de la fonction operator* l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected constructor, destructor, or type conversion before ‘operator
    D'où pourrait venir cette erreur ?
    Merci d'avance de votre aide.

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Est-ce que par hasard la déclaration de Vector ne précède pas la déclaration de l'operateur?

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    En fait je crois que je comprends mon problème.

    J'ai un fichier functions.h qui contient le prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector operator * (double number, const Vector& vector);
    Mais au début de ce fichier functions.h j'ajoute la ligne :

    afin qu'à l'endroit où ce trouve ce prototype, la structure Vector soit connue. La définition du corps de la fonction se trouve dans le fichier functions.cpp. Mais mon problème est probablement dũ au fait que dans mon fichier Vector.cpp je fait appel à la fonction operator* ci-dessus.

    Donc dans mon fichier functions.h, j'inclus Vector.h mais ma function operator* qui n'est pas encore connue à ce moment là est utilisée dans la définition de la classe Vector.

    Est-ce que ça pourrait être mon problème ?

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Si ton opérateur * est utilisé dans les méthodes de Vector, pourquoi ne le déclares-tu pas directement à l'intérieur de ta classe Vector?

    Ca donnerait:

    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
    struct Vector {
        private :
            double* tab;                                                      
            int nbComponent;                                                 
     
        public :
            Vector(int n) throw(std::invalid_argument);                                 
            Vector(const Vector& vector);                                               
            virtual ~Vector();  
            Vector operator * (double number);
            ......
    };
     
     
    /******
     ............
     ******/
     
    Vector Vector::operator * (double number) {
        Vector result(getNbComponent());
     
        for (int i=0; i< getNbComponent(); ++i) {
            result.setValue(i, number * getValue(i));
        }
     
        return result;
    }
    (Pour la fin, je ne suis pas sûr s'il faut placer le Vector:: avant ou après le operator)

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Si ton opérateur * est utilisé dans les méthodes de Vector, pourquoi ne le déclares-tu pas directement à l'intérieur de ta classe Vector?
    Parce que dans ce cas c'est la multiplication d'un Vector par un nombre (méthode que j'ai déjà faite et qui marche) mais moi j'aimerais l'autre sens, c'est-à-dire la multiplication d'un nombre par un Vector (le nombre comme premier terme de la multiplication) et il me semble que l'on ne peut pas faire ceci avec une fonction membre. C'est pourquoi j'utilise une fonction non membre.

    J'espère que ce que je dis est juste.

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par Dani3L Voir le message
    Parce que dans ce cas c'est la multiplication d'un Vector par un nombre (méthode que j'ai déjà faite et qui marche) mais moi j'aimerais l'autre sens, c'est-à-dire la multiplication d'un nombre par un Vector (le nombre comme premier terme de la multiplication) et il me semble que l'on ne peut pas faire ceci avec une fonction membre. C'est pourquoi j'utilise une fonction non membre.

    J'espère que ce que je dis est juste.
    Oui, tu as raison.

    Tu peux cependant quand même mettre la fonction dans le fichier Vector.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Vector
    {
        friend operator *(int i, Vector &v);
        .....
    };
     
    Vector operator * (int i, Vector &v);
    Et la définir dans le fichier vector.cpp.

    Si l'opérateur *(int i) existe déjà dans la classe Vector, tu peux même faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Vector
    {
        .....
    };
     
    inline Vector operator * (int i, Vector &v) {
        return v*i;
    }
    Pour "inverser" le sens.

    Ce n'est pas un crime de mettre une fonction non-membre dans un fichier .h, la STL le fait bien, par exemple pour les strings:

    Code basic_string.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      /**
       *  @brief  Concatenate C string and string.
       *  @param lhs  First string.
       *  @param rhs  Last string.
       *  @return  New string with value of @a lhs followed by @a rhs.
       */
      template<typename _CharT, typename _Traits, typename _Alloc>
        basic_string<_CharT,_Traits,_Alloc>
        operator+(const _CharT* __lhs,
    	      const basic_string<_CharT,_Traits,_Alloc>& __rhs);

    Où l'on concatène un const char* et une string, le const char * en premier, et la string en deuxième.

  7. #7
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    A oui tout ceci était une très bonne idée. Cela marche bien. Merci beaucoup pour votre aide en tous cas.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    L'opérateur proposé n'est pas const- correct.
    Avec un bon compilateur ca plantera.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    L'opérateur proposé n'est pas const- correct.
    Avec un bon compilateur ca plantera.
    Je reconnais que j'ai oubliés les const, mais je ne vois pas du tout pourquoi ça planterait avec un bon compilateur.

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Enfin si le code est valide sémantiquement, il compilera.
    Mais la compilation plantera dès que tu aura a utiliser l'opérateur avec un objet constant.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/10/2009, 20h49
  2. Erreur de segmentation surcharge opérateur []
    Par Nicoclem dans le forum C++
    Réponses: 3
    Dernier message: 17/04/2008, 18h05
  3. Surcharge d'opérateur : erreur de linkage
    Par tHE_fLAmMinG_mOE dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2006, 17h04
  4. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16
  5. [VB6] Erreur lors de l'ouverture d'un document Word
    Par Marco le Pouillot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2003, 09h30

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