Erreurs, bugs, questions - page 1889

 
Quelle est l'erreur d'effectuer
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
Quelle est l'erreur d'exécution?

si vous faites ça :

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = dynamic_cast<CLASS1*>(&Object);
  
  Ptr.i = 1;
}

c'est-à-dire la conversion en parent, alors tout se passe correctement, apparemment des changements très importants dans la structure de la langue ont eu lieu et maintenant le type dérivé n'est sans ambiguïté pas un type ancêtre.

Vérifié sur C++ :

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1* Object = new CLASS1();
  CLASS2* Ptr = (CLASS2 *)&Object;
  
  Ptr->i = 1;
}

Le transfert d'un objet d'une classe mère vers une classe dérivée est géré correctement, c'est-à-dire qu'il y a une erreur dans le mécanisme MQL5 de transfert de type, à moins qu'il n'ait pas été conçu de cette façon.

 
fxsaber:
Quelle est l'erreur d'exécution

Si vous ne vérifiez pas ce que dynamic_cast renvoie, il est inutile de l'utiliser.

 
Konstantin:

si vous faites ça :

c'est-à-dire la conversion en parent, alors tout se passe correctement, apparemment un changement très important dans la structure du langage a eu lieu et maintenant le type dérivé n'est sans ambiguïté pas un type ancêtre.

La distribution parentale a toujours fonctionné dans MQL sans dynamic_cast - classiquement. Je ne comprends peut-être pas la signification de dynamic_cast. Je ne comprends peut-être pas la signification de l'exemple dans la documentation. Quelqu'un pourrait expliquer.
 
Koldun Zloy:

Si vous ne vérifiez pas ce que dynamic_cast renvoie, il n'y a aucun intérêt à l'utiliser.

Merci, dans mon exemple, il renvoie NULL. Pourquoi cela se produit-il ?

Pourriez-vous donner un exemple pratique de l'utilisation de cette astuce ?


Les développeurs l'utilisent uniquement dans Graphic.mqh comme suit

      curve=dynamic_cast<CCurve*>(m_arr_curves.At(i));

      if(CheckPointer(curve)!=POINTER_DYNAMIC)
         return(false);

En même temps, ils ont des définitions de classes/objets comme ceci

class CCurve : public CObject

CObject          *At(const int index) const;

C'est-à-dire qu'ils transmettent un pointeur de parent à un enfant. Eh bien, c'est exactement ce que je fais dans mon exemple ! Où est le problème ?

 

Un pointeur vers une classe mère peut en fait contenir un pointeur vers une classe descendante.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

Class2* b = dynamic_cast< Class2* >( a );

// b != NULL
 
Koldun Zloy:

Un pointeur vers une classe mère peut en fait contenir un pointeur vers une classe descendante.

Merci, je l'ai eu !
 
fxsaber:
Merci, je l'ai eu !

Je ne comprends toujours pas pourquoi dans MQL on ne peut pas caster un pointeur vers un type de pointeur de classe descendante, mais en C++ c'est possible, pouvez-vous expliquer si c'est un bug dans MQL ou si ça devrait être comme ça ?

 
Konstantin:

c'est possible en C++, pouvez-vous expliquer si c'est un bug dans MQL ou si cela devrait l'être ?

En C++, cela n'est également possible que si un pointeur vers une classe de base pointe vers un descendant.
 
fxsaber:
Quelle est l'erreur d'exécution

C'est vrai, on ne peut pas conduire de bas en haut, seulement de haut en bas. C'est pour des raisons de sécurité.

Vous ne pouvez pas comparer avec le C++ - tout peut être réduit à n'importe quoi là-bas.

Raison: