Errores, fallos, preguntas - página 1889

 

¿Es esto un error o me estoy perdiendo algo? Un EA parabólico normal coloca una orden de stop en el punto anterior, en el caso de compra con el spread tomado en cuenta.
Y así el precio (Ask) ha alcanzado el precio de la orden 57781, pero la orden no se abre.

 
¿Cuál es el error de realizar
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
¿Cuál es el error de ejecución?

si lo haces de esta manera:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

es decir, la conversión a padre, entonces todo va correctamente, aparentemente se han producido cambios muy significativos en la estructura del lenguaje y ahora el tipo derivado no es definitivamente un tipo ancestro.

Comprobado en C++:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

Casting un objeto de una clase padre a una derivada se maneja correctamente, es decir, hay un error en el mecanismo de MQL5 con el casting de tipos, a menos que no fue diseñado de esa manera.

 
fxsaber:
Cuál es el error de ejecución

Si no se comprueba lo que devuelve dynamic_cast, no tiene sentido utilizarlo.

 
Konstantin:

si haces esto:

es decir, la conversión a padre, entonces todo va correctamente, aparentemente se ha producido un cambio muy significativo en la estructura del lenguaje y ahora el tipo derivado no es inequívocamente un tipo antecesor.

El casting parental siempre ha funcionado en MQL sin dynamic_cast - clásicamente. Quizás no entiendo el significado de dynamic_cast. Quizás no entiendo el significado del ejemplo en la documentación. Alguien podría explicarlo.
 
Koldun Zloy:

Si no se comprueba lo que devuelve dynamic_cast, no tiene sentido utilizarlo.

Gracias, en mi ejemplo devuelve NULL. ¿Por qué ocurre esto?

¿Podría dar un ejemplo práctico de cómo utilizar este truco?


Los desarrolladores lo utilizan sólo en Graphic.mqh de la siguiente manera

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

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

Al mismo tiempo tienen definiciones de clases/objetos como esta

class CCurve : public CObject

CObject          *At(const int index) const;

Es decir, pasan un puntero padre a un hijo. Pues eso es exactamente lo que hago en mi ejemplo. ¿Dónde está el problema?

 

Un puntero a una clase padre puede contener en realidad un puntero a una descendiente.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

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

// b != NULL
 
Koldun Zloy:

Un puntero a una clase padre puede contener en realidad un puntero a una descendiente.

Gracias, lo tengo.
 
fxsaber:
Gracias, lo tengo.

Sigo sin entender por qué en MQL no se puede castear un puntero a un tipo de puntero de clase descendiente, pero en C++ sí es posible, ¿podrías explicar si es un error de MQL o debería ser así?

 
Konstantin:

es posible en C++, ¿puede explicar si es un error en MQL o debe ser?

En C++ también es posible sólo si un puntero a una clase base apunta a un descendiente.