Discusión sobre el artículo "Usando los punteros de objeto en MQL5" - página 4

 
tol64:
¿Has encontrado un agujero de seguridad? )
Sip. Es impiadoso hacer cast directamente de esa manera. En pluses existe dynamic_cast específicamente para este propósito, aquí no se puede hacer un cast completamente correcto y es una fuente potencial de errores implícitos y graves. Y en cuanto a gravedad no es mucho mejor que los punteros y referencias inseguras.
 
denkir:

¿No sería mejor utilizar el polimorfismo?

Aproximadamente:

El caso es que las clases herederas CChartObjectRectLabel, CChartObjectButton y CChartObjectEdit, tienen sus propios métodos únicos a los que hay que acceder. Y la clase base CChartObject de la librería estándar no tiene los mismos virtuales.

 

En mi ejemplo anterior...

acceder a métodos de clases herederas?


...Resulta así:

//--- objects[0]. // ¿Cómo acceder a los métodos de la clase CChartObjectEdit?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- objects[1]. // ¿Cómo acceder a los métodos de la clase CChartObjectButton ?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objects[2]. // ¿Cómo acceder a los métodos de la clase CChartObjectRectLabel ?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
Sí. Es poco ortodoxo hacer cast directamente de esa manera. En pluses existe dynamic_cast específicamente para este propósito, aquí no se puede hacer un cast completamente correcto y es una fuente potencial de errores implícitos y graves. Y por seriedad no es mucho mejor que los punteros y referencias inseguras.

Sí, antes de hacer una pregunta aquí en el foro, encontré en la red que C++ tiene el operador dynamic_cast (un mecanismo de identificación dinámica de datos).

Ahora estoy mirando el enlace de arriba:

// El mecanismo de identificación dinámica de tipos de datos sólo está disponible para los polimórficos 
// clases (es decir, clases que contienen al menos una función miembro virtual)

¿Es una condición obligatoria? ¿Y si no hay métodos virtuales en la clase base, entonces dynamic_cast no funcionará?

P.D. >>> Aquí estoy leyendo más sobre dynamic_cast (MSDN).

 
TheXpert:
Mierda, ¿y hablas de seguridad del lenguaje después de eso?

Probablemente piensas que puedes hacer cast libremente a cualquier cosa como en C/C++.

No es así y no hay nada malo con la seguridad.

 
Renat:

Probablemente pienses que puedes hacer cast libremente a cualquier cosa como en C/C++.

No es así y no hay nada malo con la seguridad.

Me dio este error por accidente, que parece confirmar tus palabras. )

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

No lo es y no hay nada malo con la seguridad.

No, normalmente no se puede hacer una comprobación dynamic_cast en tiempo de compilación.
 
TheXpert:
No, no se puede comprobar correctamente dynamic_cast en tiempo de compilación.

El comentario anterior muestra el resultado de la comprobación de casting en rantime.

Es muy rígido, funciona en el mecanismo RTTI, porque sabemos exactamente quién es quién en caso de fantasmas.

 
Renat:

El comentario anterior muestra el resultado de la comprobación del casting en rantime.

Oops.... confundido. Pensaba que era un compilador. Luego me retracto.
 
El tutorial me ha aclarado la comprensión del polimorfismo. Gracias