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++Builder Discussion :

Différence entre dynamic_cast


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Par défaut Différence entre dynamic_cast
    Bonjour,

    Je voudrais connaitre la différence entre :

    dynamic_cast<TMaClasse*>(MonObjet)->

    et

    ((TMaClasse *)MonObjet)->

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Pour ma part, j'ai toujours utilisé la seconde solution, et je n'ai jamais eu de soucis.

    Même si je ne l'ai jamais utilisé, il me semble (d'après quelques vagues souvenirs, donc à vérifier) que dynamic_cast soit plus sûr, puisqu'il permet uniquement de transtyper dans une même hiérarchie, et ainsi de contrôler qu'on ne fait pas n'importe quoi.

    Un exemple absurde pour montrer une différence entre les deux méthodes de cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      TButton *btn = new TButton(this) ; 
     
      TEdit *edt1 = (TEdit*)btn ; //passe à la compilation
      TEdit *edt2 = dynamic_cast<TEdit*>(btn) ; //ne passe pas à la compilation
     
      ShowMessage( edt1->Text ) ;
      ShowMessage( edt2->Text ) ;
      delete btn;

  3. #3
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      TButton *btn = new TButton(this) ; 
     
      TEdit *edt1 = (TEdit*)btn ; //passe à la compilation
      TEdit *edt2 = dynamic_cast<TEdit*>(btn) ; //ne passe pas à la compilation
     
      ShowMessage( edt1->Text ) ;
      ShowMessage( edt2->Text ) ;
      delete btn;


    Ca compile très bien (sauf option RTTI absente), et c'est le but du dynamic_cast: tester dynamiquement le type d'un objet. Par contre, le second renvoie NULL. Il faut donc ensuite tester la valeur:


  4. #4
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    J'ai donc perdu une occasion de me taire!

    Par contre étant donné que c'est le genre de sujet que je ne maitrise pas du tout, je vient à la pêche au informations!

    Comment activer RTTI (autrement qu'en cochant la case "Activer RTTI" dans les options du projet, ce qui est mon cas) pour que le code compile?

  5. #5
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Pardon, moi aussi j'ai dit une bêtise: ça compile très bien... avec Visual Studio. Apparemment, Builder fait un contrôle supplémentaire (vu qu'il connait la hiérarchie des composants), ce qui n'est d'ailleurs pas conforme à la norme C++ (comme d'hab avec Builder).

    Pour que ça se compile, il faut d'abord le transformer en TObject (ou n'importe quelle classe dont hérite TButton et TEdit), puis en TEdit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      TButton *btn = new TButton(this);
      TObject *Object = btn;
     
      TEdit *edt1 = (TEdit*)btn ; //passe à la compilation
      TEdit *edt2 = dynamic_cast<TEdit*>(Object) ; //passe aussi à la compilation, mais edt2 == NULL
     
      ShowMessage( edt1->Text ) ;
      ShowMessage( edt2->Text ) ;
      delete btn;

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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