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++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut Surcharge d operateur ==
    Bonjour,
    est il possible de surcharger l operateur == pour comparer deux elements de type class*. Par exemple:

    on a une classe toto avec dedans une chaine de caracteres (string):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    toto *elt1;
    toto *elt2;
     
    if(elt1 == elt2)
    Je ne veux pas comparer la valeur des addresses mais les deux string qu'ils contiennent.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour comparer les 2 éléments pourquoi ne pas faire un bool operator==(const toto&, const toto&) ?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Citation Envoyé par Miles
    Pour comparer les 2 éléments pourquoi ne pas faire un bool operator==(const toto&, const toto&) ?
    ca me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binary 'operator ==' has too many parameters

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attends, je ne t'ai pas donné un bout de code, il te faut écrire un code correct, poste-le ensuite pour qu'on puisse te dire si c'est OK ou pas

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Ma classe est definie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SFunctions 
    {
    private :
    	string    _SFunctionPath;
    public :
    	SFunctions();
    	~SFunctions();
    	string GetSFunction();
    	void SetSFunction(char *Path);
    	bool operator==(const SFunctions&, const SFunctions&);
    	bool operator!=(const SFunctions&, const SFunctions&);
    };
    voici le corps de la surcharge de l operateur == :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool SFunctions::operator ==(const SFunctions &SFunction_Objl,const SFunctions &SFunction_Objr)
    {
    	return (SFunction_Objl.GetSFunction() == SFunction_Objr.GetSFunction());
    }

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et l'erreur complète ?

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    pardon, voici l erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    error C2804: binary 'operator ==' has too many parameters
    error C2804: binary 'operator !=' has too many parameters
    error C2662: 'SFunctions::GetSFunction' : cannot convert 'this' pointer from 'const SFunctions' to 'SFunctions &'
            Conversion loses qualifiers
     error C2662: 'SFunctions::GetSFunction' : cannot convert 'this' pointer from 'const SFunctions' to 'SFunctions &'
            Conversion loses qualifiers
    error C2662: 'SFunctions::GetSFunction' : cannot convert 'this' pointer from 'const SFunctions' to 'SFunctions &'
            Conversion loses qualifiers
    error C2662: 'SFunctions::GetSFunction' : cannot convert 'this' pointer from 'const SFunctions' to 'SFunctions &'

  8. #8
    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
    La version donnée par Miles est une fonction libre, pas une fonction membre.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par flipper203
    est il possible de surcharger l operateur == pour comparer deux elements de type class*.
    Non. On ne peut surcharger les operateurs que pour des types definis par l'utilisateur, et les pointeurs n'en sont pas.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Laurent Gomila
    La version donnée par Miles est une fonction libre, pas une fonction membre.
    Zut, je me suis fait eu de vitesse

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Non. On ne peut surcharger les operateurs que pour des types definis par l'utilisateur, et les pointeurs n'en sont pas.
    Bon je pense que s'est assez clair, je ne peut donc pas utiliser la fonction find pour rechercher un element dans une liste (stl) qui contient des pointeurs sur ma structure SFunctions, il faut que je boucle sur la liste et fasse la recherche a la main....c'est domage parce que la fonction find doit etre plus performante je pense.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    ben si, tu peux... tu définis ta fonction de comparaison. C'est ce qui est à faire dans le cas général.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    oui donc je ne peux pas utiliser la fonction find, car elle nescessite la redefinition de l operateur de compraison

  14. #14
    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
    Non, tu peux lui passer un foncteur. Voir la FAQ C++.

    c'est domage parce que la fonction find doit etre plus performante je pense
    Pas réellement non. Hormis les pinaillages, elle ne fait que cacher la boucle que tu aurais écrite.

  15. #15
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    comme dis plus haut tu dois creer ta propre fonction de comparaison et la setter dans ton conteneur STL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef bool (*CompareFunction)(CoreObjectIF *, CoreObjectIF *);
     
    static bool DefaultCompareFunction(CoreObjectIF *poObj1, CoreObjectIF *poObj2) 
    {
        return poObj1->IsLessThan(poObj2);
    };
    ensuite tu n'as plus qu'a donner ta fonctiond e comparaison a ton conteneur et la methode find l'utilisera.

  16. #16
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Si ton conteneur est trié, tu as equal_range, lower_bound, et upper_bound pour réaliser des recherches dichotomiques.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. [débutant] surcharge d'opérateur
    Par mouss31 dans le forum Visual C++
    Réponses: 4
    Dernier message: 03/11/2006, 10h00
  2. est ce possible de surcharger les operateurs
    Par dietrich dans le forum Delphi
    Réponses: 5
    Dernier message: 26/08/2006, 11h15
  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