Discussion de l'article "Utilisation des pointeurs d'objet dans MQL5" - page 4

 
tol64:
Avez-vous trouvé une faille de sécurité ? )
Oui, c'est impardonnable de faire un cast directement comme ça. Dans les plus, il y a dynamic_cast spécifiquement pour ce but, ici on ne peut pas caster complètement correctement et c'est une source potentielle d'erreurs implicites et sérieuses. Et en termes de gravité, ce n'est pas beaucoup mieux que les pointeurs et références non sécurisés.
 
denkir:

Ne serait-il pas préférable d'utiliser le polymorphisme?

En fait, c'est approximatif :

Le problème est que les classes héritières CChartObjectRectLabel, CChartObjectButton et CChartObjectEdit ont leurs propres méthodes auxquelles il faut accéder. Et la classe de base CChartObject de la bibliothèque standard n'a pas les mêmes méthodes virtuelles.

 

Sur mon exemple ci-dessus...

accéder aux méthodes des classes héritières ?


...il en résulte ceci :

//--- objets[0]. // Comment accéder aux méthodes de la classe CChartObjectEdit ?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- objets[1]. // Comment accéder aux méthodes de la classe CChartObjectButton ?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objets[2]. // Comment accéder aux méthodes de la classe CChartObjectRectLabel ?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
Oui. Il n'est pas très orthodoxe de lancer directement comme cela. Dans les plus, il y a dynamic_cast spécifiquement pour ce but, ici vous ne pouvez pas le caser complètement correctement et c'est une source potentielle d'erreurs implicites et sérieuses. Et pour être sérieux, ce n'est pas beaucoup mieux que les pointeurs et références non sécurisés.

Oui, avant de poser une question ici sur le forum, j'ai trouvé sur le net que le C++ possède l'opérateur dynamic_cast (un mécanisme d'identification dynamique des données).

Maintenant, je regarde le lien ci-dessus :

// Le mécanisme d'identification dynamique des types de données n'est disponible que pour les types polymorphes. 
// les classes (c'est-à-dire les classes contenant au moins une fonction membre virtuelle)

C'est donc une condition obligatoire ? Et s'il n'y a pas de méthodes virtuelles dans la classe de base, alors dynamic_cast ne fonctionnera pas ?

P.S. >>> Je suis en train de lire plus d'informations sur dynamic_cast (MSDN).

 
TheXpert:
Merde, et vous parlez de sécurité du langage après ça ?

Vous pensez probablement que vous pouvez librement faire des castings vers n'importe quoi comme en C/C++.

Ce n'est pas le cas et il n'y a rien de mal à la sécurité.

 
Renat:

Vous pensez probablement que vous pouvez librement convertir en n'importe quoi comme en C/C++.

Ce n'est pas le cas et il n'y a rien de mal à la sécurité.

J'ai obtenu cette erreur par accident, ce qui semble confirmer vos propos. )

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

Ce n'est pas le cas et il n'y a rien de mal à la sécurité.

Non, vous ne pouvez normalement pas effectuer une vérification dynamic_cast à la compilation.
 
TheXpert:
Non, il est impossible de vérifier dynamic_cast à la compilation.

Le commentaire ci-dessus montre le résultat de la vérification du casting dans rantime.

Il est très rigide, il fonctionne sur le mécanisme RTTI, parce que nous savons exactement qui est qui dans le cas des fantômes.

 
Renat:

Le commentaire ci-dessus montre le résultat de la vérification du casting dans rantime.

Oops.... confus. Je pensais qu'il s'agissait d'un compilateur. Puis je retire ce que j'ai dit.
 
Le tutoriel m'a permis de comprendre clairement le polymorphisme. Merci de votre compréhension.