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

Langage C++ Discussion :

surcharge d'opérateur de transtypage


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut surcharge d'opérateur de transtypage
    Bonjour,

    Voici un petit code d'exemple dont je ne comprends pas l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    class myClass {
    public :
      operator void*() const { return (void*)this;}
    };
     
    void main() {
     
      myClass myClass1;
      if ( myClass1 )
        int i = 0;
     
    }
    Si je trace ce code, alors l'exécution du test if ( myclass1 ) entraîne l'appelle de l'opérateur de transtypage (void*) de la classe myClass.
    Si j'implémente myClass::operator bool() alors c'est l'opérateur de
    transtypage (bool) de la classe myClass qui est appelé.

    Quelqu'un pourrait m'expliquer pourquoi le compilateur génère un appel à l'opérateur de transtypage (void*) de la classe myClass si myClass::operator bool() n'existe pas ?

    Merci pour votre aide.

    Sylvain

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Il me semble que l'article The Safe Bool Idiom l'explique assez bien. En résumé :
    Any rvalue of arithmetic, enumeration, pointer, or pointer to member type, can be implicitly converted to an rvalue of type bool

  3. #3
    screetch
    Invité(e)
    Par défaut
    un const void* serait le bienvenu (c'est pas le problème évidemment)

    c'est parce que un void* peut etre casté uniquement en un bool
    tandis qu'un bool peut lui etre casté vers un int, meme un float, sans problème.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Test
    {
        operator bool () const { return true; }
    };
     
    int main(int argc, char *argv[])
    {
        Test t;
        float f = t;
        return 0;
    }
    donc il est conseillé de ournir un opérateur vers (const)void* pour la conversion en bool, et un opérateur ! pour le test d'invalidité (pour couvrir les cas if(blabla) et if(!blabla)

  4. #4
    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
    A noter que dans la prochaine version du C++, on pourra définir un tel opérateur comme explicit, ce qui fait qu'on pourra simplement retourner un bool et arrêter tous ces contournements (remarque : L'opérateur de conversion en void* n'est pas la méthode la plus sûre actuellement).
    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.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Remerciements
    Merci pour vos réponses, c'est plus clair maintenant.

    Une précision : JolyLoic, tu veux dire que dans la version ultérieure de C++, le mot clé "explicit" employé sur l'opérateur de transtypage implique que cela sera le constructeur de transtypage qui sera appelé lors d'une conversion implicite et non l'opérateur de transtypage ?

    Cordialement

    Sylvain

  6. #6
    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
    Non, je veux dire que si on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A
    {
    public:
      explicit operator bool() {...}
    };
     
    A a;
    if (a) {...} // Ok
    bool b1 = a; // Ok
    bool b2 = !a; // Ok
    bool b3 = c && a; // Ok
    int i1 = a; // Pas ok
    int i2 = a+1; // Pas ok
    Sans le explicit (la situation courante), toutes les lignes seraient ok, et appelleraient l'opérateur de conversion, ce qui n'est probablement pas souhaité, et a causé tout un tas de contournements.

    Pour plus de détails : http://www.open-std.org/jtc1/sc22/wg...2007/n2437.pdf
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Résolu !
    Merci pour tant de pédagogie !

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

Discussions similaires

  1. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  2. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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