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 :

Redéfinition d'opérateur & pointeurs


Sujet :

C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut Redéfinition d'opérateur & pointeurs
    Bonjour,

    Étant un peu en avance à un TP, mon prof de C++ m'a demandé de faire en sorte de redéfinir bool operator<(Creature *, Creature *).

    Il pensait que ce serait possible en utilisant des templates mais après essais et renseignement, ce n'est pas possible de cette manière.

    J'ai tenté de créer une classe dont le constructeur prend en paramètre un Creature * en espérant avoir une conversion implicite mais cela ne marche pas non plus.

    Mon professeur pense que l'opérateur< a été défini de manière générique et qu'il se peut qu'il cast les pointeurs vers des pointeurs void *.
    Le but serait alors de définir quelque chose de plus spécifique pour créer notre propre operateur(Creature *, Creature *).

    Auriez-vous des pistes ou des idées ?

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Vu qu'un pointeur c'est un long (généralement) ton opérateur < va comparer des long. Normal non ?

    Je pense que ça marcherait si tu passais par des références (constantes).

    Ou si tu ne peux pas, il faudrait que tu crées un foncteur/fonction de comparaison que tu passerais là où tu en as besoin.

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Vu qu'un pointeur c'est un long (généralement) ton opérateur < va comparer des long. Normal non ?
    Un pointeur n'est pas un long, c'est un type à part entière :
    -int * ptr; long test = ptr; refusera de compiler.
    L'opérateur < va comparer la valeur des pointeurs.

    Citation Envoyé par Trademark Voir le message
    Je pense que ça marcherait si tu passais par des références (constantes).
    Malheureusement, le compilateur n'accepte pas aussi les référence sur des pointeurs constants.

    Citation Envoyé par Trademark Voir le message
    Ou si tu ne peux pas, il faudrait que tu crées un foncteur/fonction de comparaison que tu passerais là où tu en as besoin.
    Citation Envoyé par jabbounet
    peut que jeter un oeil ici t'aidera:

    http://cpp.developpez.com/faq/cpp/?p...ator_inferieur

    http://stackoverflow.com/questions/4...or-overloading

    http://www.cplusplus.com/reference/std/functional/less/
    Oui je sais mais ce n'est pas le but^^
    La meilleur solution étant d'utiliser des shared_ptr au lieu d'utiliser de simples pointeurs.

    Mais les Creature * ne sont pas des built-in type, ce sont des user-defined type donc en théorie il devrait être possible de surcharger un opérateur avec des pointeurs sur Creatures.

    Il doit aussi y avoir quelque chose de générique pour la comparaison de pointeurs et donc on doit pouvoir apporter une définition plus spécialisée qui nous permettrait de redéfinir l'opérateur à moins qu'il y ai dans la définition des pointeurs quelque chose de spécial qui nous échappe ?

  5. #5
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    On ne peut pas :
    Citation Envoyé par Le standard 13.5/6
    An operator function shall either be a non-static member function or be a non-member function and have at least one parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration.
    L’opérateur < est défini sur les pointeurs, quel que soit leur type, et on n'en peut mais...
    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.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    L’opérateur < est défini sur les pointeurs, quel que soit leur type, et on n'en peut mais...
    Je dois avouer que je suis un petit peu perplexe.

    Est-ce que cette interdiction est dû à la norme ou à une réelle contrainte technique ?
    Un compilateur est pourtant capable de surcharger des opérateurs et de différencier des pointeurs pointant sur des objets de différents types.

    Serait-ce dû au fait que certaines bibliothèques standard ont besoins de ces opérateurs pour n'importe quel pointeurs et que si on laissait à l'utilisateur la possibilité de changer le comportement de l'opérateur on ferait tout planter ?

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Nulle part dans le langage on permet de remplacer une opération définie par le langage. Le plus proche est le remplacement des opérateurs new et delete globaux, qui relève de la bibliothèque.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Nulle part dans le langage on permet de remplacer une opération définie par le langage. Le plus proche est le remplacement des opérateurs new et delete globaux, qui relève de la bibliothèque.
    Je pense que j'ai compris, par exemple, pour calculer le nombre d'éléments d'un vecteur, le vecteur utilise l'opérateur - sur deux pointeurs.
    Or si on redéfini cet opérateur, on aura des résultats erronés.

    On est donc obligé d'interdire la surcharge des opérateurs pour les pointeurs sinon on risque de se retrouver avec des comportements indéterminés et on ne peut plus utiliser l'arithmétique des pointeurs.

    Merci pour vos réponses.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    J'ai regardé les 2 posts.
    Si j'ai bien compris en gros tu as une comparaison a faire entre deux créatures et voir si les pv de l'un sont inférieur à l'autre.

    Donc c'est possible par la surcharge d'opérateur (je ne rentrerais pas dans les débat vu sur les posts vu que c'est purement pédagogique dans ton cas).

    Alors la solution n'est pas très compliqué enfaîte tu as juste a faire comme ceci

    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
     
    class creature
    {
         int pv;
     
        public:
        int getPv()...
     
        friend bool operator<(creature&, creature&);
    }
     
    bool operator<(creature* a, creature* b)
    {
       if (a.getPv() < b.getPv())
          return true;
       return false;
    }
    Normalement de mémoire ça marche.
    (petite correction ajoutée).

    Bonne journée.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Non c'est strictement impossible de redéfinir un opérateur sur des pointeurs.
    La syntaxe serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool operator<(const Creature&, const Creature&);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Effectivement au temps pour moi.
    Désolé pour mon erreur.

    Bonne journée

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et il n'est pas utile de rendre l'operateur friend s'il n'utilise que l'accesseur public.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/12/2007, 10h13
  2. redéfinition d'opérateur STL
    Par eklips dans le forum SL & STL
    Réponses: 4
    Dernier message: 19/10/2007, 22h57
  3. surcharge d'opérateur et pointeur
    Par cyril_sy dans le forum C++
    Réponses: 3
    Dernier message: 24/08/2007, 17h19
  4. Erreur de lien : redéfinition d'opérateurs
    Par poukill dans le forum C++
    Réponses: 3
    Dernier message: 02/07/2007, 15h44
  5. redéfinition des opérateurs en C++
    Par apan dans le forum C++
    Réponses: 11
    Dernier message: 27/03/2006, 15h58

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