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 operateur && pointeurs


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut surcharge operateur && pointeurs
    bonjour a tous,

    j'ai un petit probleme avec la surcharge d'operateur.
    j'ai une classe Maclasse qui possede entre autre un membre entier.
    je souhaite que la comparaison de deux instances de Maclasse revienne à faire la comparaison de leur membre entier respectif ( c'est pas clair)

    Maclasse.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
     
    #ifndef MACLASSE_H
    #define MACLASSE_H
     
    class Maclasse 
    {
          public:
                 Maclasse (int = 0);
                 int getint() const;
                 bool operator < (Maclasse);
                 bool operator > (Maclasse);
                 bool operator == (Maclasse);
                 bool operator != (Maclasse);
    ...
          private:
                  int entier;
    ...
     
    };
    #endif
    Maclasse.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
     
    #include <iostream>
    #include "Maclasse.h"
     
    using namespace std;
     
    Maclasse:: Maclasse(int i)
    {
             entier = i;
    }
     
    int Maclasse:: getint() const
    {
        return entier;     
    }
     
    bool Maclasse:: operator < (Maclasse m)
    {
              cout << "operator <" << endl;
              return(entier < m.getint());
    }
     
    bool Maclasse :: operator > (Maclasse m)
    {
             cout << "operator >" << endl;
             return(entier > m.getint());
    }
     
    bool Maclasse :: operator == (Maclasse m)
    {
             cout << "operator ==" << endl;
             return(entier == m.getint());
    }
     
    bool Maclasse :: operator != (Maclasse m)
    {
             cout << "operator !=" << endl;
             return(entier != m.getint());
    }
    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
     
    #include <iostream>
    #include "Maclasse.h"
     
    using namespace std;
     
    int main ()
    {
        maclasse a(1);
        maclasse b(2);
     
        if(a < b)
        {
             cout << "a(1) < b(2)" << endl;
        }
        if(a > b)
        {
            cout << "a(1) > b(2)" << endl;
        }
        if(a == b)
        {
            cout << "a(1) == b(2)" << endl;
        }    
        if(a != b)
        {
            cout << "a(1) != b(2)" << endl;
        }
        return 0;
    }
    l'execution donne :
    operator: <
    a(1) < b(2)
    operator: >
    operator: ==
    operator: !=
    a(1) != b(2)
    bon, a priori jusque là ça fonctionne.
    j'en viens (enfin) à mon probleme:
    je voudrais utiliser des pointeurs de Maclasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    maclasse *a = new maclasse(1);  // au lieu de: maclasse a(1);
    maclasse *b = new maclasse(2);  // au lieu de: maclasse b(2);
    ...
    bien entendue les operateurs ne marchent pas.
    si quelqu'un peut m'aiguiller sur comment utiliser ET la surcharge des opérateurs ET les pointeurs...
    merci d'avance.

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu compares a et b tu vas comparer des pointeurs. Si tu veux comparer les valeurs pointées il suffit de comparer *a et *b.

    Remarque qui ne mange pas de pain : tu devrais passer tes paramètres par référence constante. Tu devrais également implémenter un maximum d'opérateurs en fonction d'autres (au moins != en fonction de ==). Pour des classes très petites ça ne change rien, mais dès que celle-ci va grossir tu vas augmenter le risque d'incohérences / erreurs.

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par Loulou24
    Si tu veux comparer les valeurs pointées il suffit de comparer *a et *b
    donc dans le main je doit coder : impec! 8)
    Citation Envoyé par Loulou24
    Tu devrais également implémenter un maximum d'opérateurs en fonction d'autres (au moins != en fonction de ==)
    c'est-a-dire ?

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est à dire :

    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
    bool MaClasse::operator <(const MaClasse& m) const
    {
        return entier < m.entier;
    }
     
    bool MaClasse::operator ==(const MaClasse& m) const
    {
        return !(*this < m) && !(m < *this);
    }
     
    bool MaClasse::operator !=(const MaClasse& m) const
    {
        return !(*this == m);
    }
     
    bool MaClasse::operator >(const MaClasse& m) const
    {
        return !(*this < m) && !(*this == m);
    }
     
    bool MaClasse::operator >=(const MaClasse& m) const
    {
        return !(*this < m);
    }
     
    bool MaClasse::operator <=(const MaClasse& m) const
    {
        return !(*this > m);
    }
    Si tu modifies ta classe, tu n'auras que < à modifier.

    Attention dans certains cas, égalité (== et !=) et équivalence (<, >, <= et >=) ne seront pas en relation, il faudra donc les séparer.

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    super cool la technique...mais
    comme j'ai passer les paramètres par référence constante, devcpp geule :
    30 C:\Dev-Cpp\tests\3\maclasse.cpp passing `const maclasse' as `this' argument of `bool maclasse::operator<(const maclasse&)' discards qualifiers
    je suppose que *this n'est pas consideré comme const et donc la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return !(*this < m) && !(m < *this);
    pose un probleme

  6. #6
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    je suppose que *this n'est pas consideré comme const
    Non, ce sont tes fonctions qui ne sont pas const. Si tu regardes attentivement tu verras qu'elles le sont dans mon code.

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par Loulou24
    Non, ce sont tes fonctions qui ne sont pas const. Si tu regardes attentivement tu verras qu'elles le sont dans mon code.
    oups desole

    En tout cas maintenant ça marche nickel
    beaucoup

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

Discussions similaires

  1. surcharge operateur externe symmetrique
    Par harsh dans le forum C++
    Réponses: 1
    Dernier message: 13/07/2006, 16h10
  2. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 13h59
  3. Surcharge operateur =
    Par rulianf dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 00h32
  4. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  5. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

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