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 de surcharge d'opérateurs


Sujet :

C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Par défaut Problème de surcharge d'opérateurs
    Bonjour
    Maintenant que j'ai bien compris les surcharges et polymorphismes, je me suis mis à étudier les surcharges d'opérateurs

    J'ai donc essayé de créer une classe entier avec deux surcharges pour l'opérateur =

    Lorsque je crée un entier avec ma classe et que j'affecte cet entier à une variable int, j'ai le compilateur qui grogne "cannot converter 'entier' to 'int'
    Pourtant j'ai surchargé l'opérateur =, je ne comprends pas ce qui se passe

    Pouvez vous me dire ce qui ne va pas s'il vous plait? Car je trouve pas, et comme je débute je pense pas que je vais trouver avant longtemps

    Voici le code de ma classe, ansi que le programme :

    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
    31
    32
    33
    34
    class entier
    {
        private:
            int nombre;
        public:
            void init(int);
            int get_nombre();
            void operator=(int);
            int operator=(entier);        
    };
     
    //initialise
    void entier::init(int nb)
    {
        this->nombre = nb;
    }
     
    //retourne le nombre
    int entier::get_nombre()
    {
        return this->nombre;   
    }
     
    //quand on affecte un int à un entier
    void entier::operator=(int nb)
    {
        entier::init(nb);    
    }
     
    //quand on affecte un entier à un int
    int entier::operator=(entier nb)
    {
        return nb.get_nombre();    
    }
    Main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      entier nb1;  
      int nb3; 
      nb1 = 5; //fonctionne
      nb3 = nb1; //c'est la que ça coince
    }
    Merci d'avance pour votre aide

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour convertir un entier en int, il faudrait non pas un opérateur = (qui permet de convertir un int en entier), mais un operateur de cast. Tu confonds un peu les sens de conversion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    entier::operator int() const
    {
        return nombre;
    }
    A part ça quelques conseils : en général on n'écrit qu'un seul opérateur d'affectation (qui prend en paramètre un objet du même type que la classe), et on laisse le soin aux constructeurs d'effectuer les conversions implicites. Ca te simplifiera la tâche et ça t'évitera des erreurs de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    entier i = 5; // marche pas
     
    entier i;
    i = 5; // marche
    Encore une chose : le prototype habituel pour l'opérateur d'affectation est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse& operator =(const Maclasse&);

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,

    Il me semble que vous faîtes une erreur de conception.
    L' opérateur d' affectation (=) s'utilise généralement pour une classe , peut-être moins bien pour des fonctions membres d'une classe.

    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 A
    { private :
      protected :
      int x  ;
      public :
      A() : x(0) {} ;
      A(const A& a ) : x(a.x) {}
      A& operator=( const A& a )
       { if( this != &a )
         x= a.x ;
         return *this ; 
       }
     ~A() {}
      virtual void setx( int xx ) { x =  xx ; }
      virtual void addx( int xx ) { x += xx ; }
       int getx() { return x ; } 
    };
    "virtual" pour pouvoir dériver ces fonctions à partir de la classe A .

    Cordialement.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Par défaut
    Bonjour
    Merci à tous pour votre aide

    Pour l'opérateur de cast, ça serait pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int entier::operator int() const
    {
        return nombre;
    }
    ? car on retourne un int, enfin moi je vois ça comme une fonction

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce serait naturel oui, mais les opérateurs de cast ont une syntaxe particulière, on ne doit pas indiquer ce qu'ils retournent (imagine que tu fasses renvoyer un string à ton opérateur de cast en int )

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Non, ne me faîtes ce qu'en aucun cas j"aprouverais conme "cast".
    Enfermé dans du Loulou24....

    Cordialement.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par dj.motte
    Enfermé dans du Loulou24....

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,

    Et oui Loulu24
    vous écivez:
    Enfermé dans du Loulou24....
    Enfermer et prisonnnié d' un code abusrde:

    Cordialement.

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,

    Je n' ai jamais écrit, mais cîté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pour l'opérateur de cast, ça serait pas plutot 
     Code: 
     int entier::operator int() const 
      { 
          return nombre; 
      } 
     
     ? car on retourne un int, enfin moi je vois ça comme une fonction
    Alors messieux les modérateurs à vous de vous modérer.

    Cordialement.

  10. #10
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    Citation Envoyé par dj.motte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pour l'opérateur de cast, ça serait pas plutot 
     Code: 
     int entier::operator int() const 
      { 
          return nombre; 
      } 
     
     ? car on retourne un int, enfin moi je vois ça comme une fonction
    Bonsoir,
    j'ai essayé votre code en compilant avec g++ 3.3.2 et cela ne marche pas.
    Pour aider le pauvre hell, le mieux avant de poster du code et de le tester.

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Par défaut
    Ce message

    Pour l'opérateur de cast, ça serait pas plutot
    Code:
    int entier::operator int() const
    {
    return nombre;
    }

    ? car on retourne un int, enfin moi je vois ça comme une fonction
    est de moi non? à moins que je devienne fou o_O

    Autrement j'ai mis ce bout de code et ça fonctionne très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    entier::operator int()
    {
        return this->nombre;    
    }

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    Je désapprouve le code qui suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    entier::operator int() 
     { 
         return this->nombre;    
     }
    Parce que pas d"héritage possible.
    Mal formé, ambigue .

    C++ propose selon un schéma classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Classe <=> propriété  <=> fonction-membre <=>
    C++ propose le schéma plus évolué selon le système d'exploitation
    Classe <=> propriété <=> fonction-membre <=> évènement <=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Classe <=> propriété  <=> fonction-membre <=> événements <=>
    Cordialement.

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Par défaut
    Bonsoir

    Pas d'héritage possible, c'est normal car c'est juste une classe pour tester, par contre si j'avais besoin qu'une classe puisse en hériter, je le modifierais

    Par contre je comprends pas pourquoi il est mal formé et ambigue, comment tu l'écrirais si tu avais à faire cette surcharge?

    Merci d'avance

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,
    entier::operator int()
    {
    return this->nombre;
    }

    Cela n'a de sens que pour la classe "entier". Que se passe-t-il si on dérive une classe "baba" de "entier" ?

    Cordialement.

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Toutes les classes ne sont pas conçues pour être dérivées. En l'occurence, la personne qui dérive de entier ne respecte pas la documentation de entier.

    Un bon indicateur indiquant si la classe a été prévue pour être dérivée est de regarder si elle a des fonctions virtuelles (au moins le destructeur...).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre expérimenté
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Par défaut
    D'autre part la classe "baba" doit répondre à la sémantique "isA(entier)".
    Donc il y des grandes chances qu'initaliser un Baba ou un Entier (dites par contre, c'est pas mieux avec des majuscules ?) avec un int est la même sémantique.
    Et au pire, dans des cas plus tordus concernants d'autres classes qui necessiterais un opérateur virtuel, ne suffit il pas de le déclarer virtual ?

    PS : Je pense que ce thread est parti en quiproquo généralisé... Si on relis depuis le début c'est assez marrant...
    A ce propos, dj.motte, ne serait-il pas mieux d'être constructif et d'indiquer clairement la solution au problème considéré ? Ca permet de gagner en clareté et de baisser en animosité...

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,

    Désolé. J'ai proposée une solution en début de poste, mais elle n'a pas convaincu.

    Mille excuses.

    Cordialement.

  18. #18
    Membre éclairé

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Par défaut
    Bonjour
    Ce n'est pas qu'elle a pas convaincue mais je suis débutant et j'ai uniquement compris la solution de Loulou24, voila pourquoi j'ai continué avec

Discussions similaires

  1. Problème de surcharge d'opérateur flux avec pointeur
    Par eleve_prog dans le forum Débuter
    Réponses: 4
    Dernier message: 18/04/2011, 18h41
  2. problème au surcharge d'opérateur =
    Par zougagh dans le forum C++
    Réponses: 12
    Dernier message: 28/06/2010, 17h29
  3. Problème de surcharge d'opérateur std::cout
    Par Nyko17 dans le forum C++
    Réponses: 14
    Dernier message: 28/04/2008, 13h01
  4. Réponses: 7
    Dernier message: 02/12/2007, 21h43
  5. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15

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