Bonjour,
Je voudrais connaitre la différence entre :
dynamic_cast<TMaClasse*>(MonObjet)->
et
((TMaClasse *)MonObjet)->
Merci d'avance pour votre aide !
Bonjour,
Je voudrais connaitre la différence entre :
dynamic_cast<TMaClasse*>(MonObjet)->
et
((TMaClasse *)MonObjet)->
Merci d'avance pour votre aide !
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;
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (edt2) { ... }
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?
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;
Partager