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 :

reinterpret_cast votre avis ?


Sujet :

C++

  1. #1
    Membre habitué
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Points : 144
    Points
    144
    Par défaut reinterpret_cast votre avis ?
    Bonsoir !
    Au cours de mon projet, je suis souvent amené à utiliser le reinterpret_cast car à un certains moment je sais que j'utilise un type plus bas dans mon héritage qui possède certaines fonctions dont j'ai besoin. Cependant, ça m'a pas l'air jolie comme façon de faire, est-ce vous pensez que c'est quelque chose à éviter ?

    Edit:
    Euh, j'ai un énorme doute là. Admettons j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A{};
    class B : public A {};
    class C : public A {};
    class D : public B {};
    class E : public C {};
    Et que au cours de l'exécution, je sache si je manipule un E ou D, mais que j'ai un pointeur sur un A (où A m'est fourni par une lib externe). Le mieux, c'est de faire static_cast<E*>(ptrA) ou reinterpret_cast<E*>(ptrA) ?

  2. #2
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    D'après la faq http://cpp.developpez.com/faq/cpp/?page=conversions
    c'est plutot un dynamic_cast dont tu as besoin. A utiliser avec précaution, le RTTI n' pas très bonne presse. Mais dans le cas de l'utilisation d'une lib externe il peut se justifier (sans vouloir relancer ce débat une énième fois).
    all your base are belong to us.

  3. #3
    Membre habitué
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Points : 144
    Points
    144
    Par défaut
    Mais euh, pourtant ça marche si je fais un static_cast ... C'est étrange ça.

  4. #4
    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
    Citation Envoyé par Aladore Voir le message
    Mais euh, pourtant ça marche si je fais un static_cast ... C'est étrange ça.
    static_cast réalise le transtypage à la compilation sans tenir compte du type dynamique effectif de ton pointeur. S'il est compatible alors pas de problème, sinon le comportement est indéterminé.
    dynamic_cast s'appuie sur le type dynamique pour vérifier le transtypage. Si celui-ci est incompatible, alors le résultat est un pointeur nul (une exception si utilisé avec des références) :
    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
    struct A{
        int a;
        A():a(0){}
        virtual ~A(){} // dynamic_cast nécessite que la classe soit polymorphe
    };
    struct B : public A{
        int b;
        B():b(1){}
    };
    struct C : public A{
        int c;
        C():c(2){}
    };
     
    int main()
    {
        A a;
        B b;
        C c;
     
        A*pa;
        B*pb;
        C*pc;
     
     
        pa = &a;
        pb = static_cast<B*>(pa);// compil OK, exécution indéterminée (probablement pb!=NULL et membre==n'importe quoi)
        pc = dynamic_cast<C*>(pa);// à l'exécution pc == NULL;
     
        pa = &b;
        pb = static_cast<B*>(pa);// compil OK, exécution OK
        pc = dynamic_cast<C*>(pa);// à l'exécution pc == NULL;
     
        pa = &c;
        pb = static_cast<B*>(pa);// compil OK, exécution indéterminée (probablement pb!=NULL et membre==n'importe quoi)
        pc = dynamic_cast<C*>(pa);// pc!=NULL
     
        return 0;
    }
    Cf Les fonctions virtuelles en C++, Conversions entre type de base et type dérivé


    Quant à 'est-ce bien ou mal de faire un transtypage', cf F.A.Q. :
    Pourquoi l'utilisation du downcasting est-il souvent une pratique à éviter ?

  5. #5
    screetch
    Invité(e)
    Par défaut
    dans tous les cas de figure, ce reinterpret_cast est a proscrire, il est faux.

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    static_cast réalise le transtypage à la compilation
    Pas forcément... Il ne tient compte que tu type statique oui, mais le cast n'est pas dans tout les cas fait à la compilation, il peut être fait au runtime.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. Donnez votre avis sur les articles de Developpez.com
    Par Geronimo dans le forum C++Builder
    Réponses: 13
    Dernier message: 14/01/2007, 22h00
  2. Qui se sert de Together ici ? votre avis ?
    Par Matthieu Brucher dans le forum Autres
    Réponses: 28
    Dernier message: 25/08/2006, 09h44
  3. Donnez votre avis sur les articles de Developpez
    Par Anomaly dans le forum Contribuez
    Réponses: 37
    Dernier message: 29/05/2006, 21h48
  4. [Débat] Votre avis sur la section "Dev Web"
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 31
    Dernier message: 03/03/2004, 20h55
  5. Réponses: 4
    Dernier message: 22/05/2003, 11h15

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