Errores, fallos, preguntas - página 1890

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

Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.

No se puede comparar con C++: allí todo se puede reducir a cualquier cosa.

 
Комбинатор:
En C++ también funciona sólo si un puntero a una clase base apunta a su descendiente.

No sé qué quieres decir con eso, pero este código:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int main() {
  CLASS1 _object;
  CLASS2 *_ptr = (CLASS2*)&_object;  
  _ptr->i = 1;

   return 0;
}

funciona en C++, que es lo que he escrito arriba. Y aquí está el mismo código (considerando la sintaxis MQL):

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

int OnInit() {
  CLASS1 _object;
  CLASS2 *_ptr = dynamic_cast<CLASS2 *>(&_object);
  
  _ptr.i = 1;

   return 0;
}
ya no funciona porque _ptr se convierte en NULL
Lo que nos lleva a preguntarnos si es un error de MQL y si se va a arreglar o se va a quedar así.
 
Renat Fatkhullin:

Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.

No se puede comparar con C++: allí todo se puede reducir a cualquier cosa.


Ya lo tengo, gracias por la aclaración ))
 
Konstantin:

No sé qué quieres decir con eso, pero este código:

Bueno, trata de entenderlo. Empieza por hacer que dynamic_cast funcione en los pluses. Si lo averiguas por tu cuenta, te irá mucho mejor.
 
Renat Fatkhullin:

Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo.

¿Qué quieres decir con que no se puede pasar de una clase base a una descendiente?
 
Комбинатор:
¿Quieres decir que no puedes hacer un casting de una clase base a una descendiente?

Sí, en caso de que la clase base no tenga un descendiente realmente construido.

 
Renat Fatkhullin:

Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.

Si llevamos el puntero de arriba a abajo, es decir, al padre, y luego pasamos el puntero a otro lugar del ámbito, ¿están disponibles allí los campos del descendiente?
 
Renat Fatkhullin:

Sí.

Renate, ¿sabes qué es dynamic_cast?
 
Комбинатор:
Renat, ¿sabes qué es dynamic_cast?

Por supuesto.

Mira el trozo de código MQL5 comentado. Se crea una instancia base y luego se intenta convertir heroicamente vía dynamiccast a descendiente violando la seguridad. Bueno, es una pena, por supuesto.

 

El mismo ejemplo se discute y explica directamente en la documentación. El reparto dinámico en tiempo de ejecución se activa sólo después de comprobar el sistema de seguridad y la permisividad de las conversiones. Cada objeto MQL5 tiene toda la meta-información para comprobar los derechos en tiempo de ejecución. Esto no es un C++ vacío.


Conversión dinámica de tipos mediante el operador dynamic_cast

Es posible fundir dinámicamente los tipos utilizando el operador dynamic_cast, que sólo puede aplicarse a los punteros de clase. En este caso, la comprobación de la corrección de los tipos se realiza en el momento de la ejecución del programa. Significa que al utilizar el operador dynamic_cast el compilador no comprueba el tipo de datos utilizado para la conversión. Si se realiza la conversión de un puntero a un tipo de datos que no es el tipo real del objeto, el resultado será NULL.

dynamic_cast<tipo-id> ( expresión )

El parámetro type-id entre corchetes debe ser un puntero a un tipo de clase previamente definido . Eltipo de operando de la expresión (a diferencia de C++) puede ser cualquier cosa excepto void.

Ejemplo:

clase CBar { };
clase CFoo :public CBar { };

voidOnStart( )
{
Barra de CBar;
//--- se permite el reparto dinámico del tipo de puntero *bar a puntero *foo
CFoo *foo =dynamic_cast<CFoo*>(&bar);//--- no hay error crítico de ejecución
Print(foo);// foo=NULL
//--- intentar explícitamente lanzar una referencia del objeto Bar a un objeto Foo está prohibido
foo=(CFoo *)&bar;// se producirá un error de ejecución crítico
Print(foo);// esta línea no se ejecutará
}

Razón de la queja: