Todavía no entiendo acerca de los punteros y referencias en MQL5 y ahora en MQL4. ¿Cuál es la diferencia entre pasar por referencia y puntero a excepción de código extra? Hay una diferencia en C ++, pero ¿qué es aquí? Si no es difícil de escribir más detallada.
Pasar por referencia requiere que el objeto pasado por referencia sea inicializado. Pasar por puntero no tiene esta restricción:
Al llamar a la función TestShapeRef, el código se bloqueará porque la forma no está inicializada. Por otro lado, dentro de la función TestShapePointer, se requieren comprobaciones constantes de si el objeto pasado está inicializado o no. Por lo tanto, siga la regla imprírica:
Si se debe garantizar que el objeto existe en el momento en que se pasa a la función, utilice un pase "&". Si la función requiere un objeto cuyo estado es indefinido - utilice el paso por el puntero "*", y dentro de esta función compruebe la validez del puntero pasado.
Hay otro matiz sutil que debe tener en cuenta. Considere el ejemplo anterior:
¿Funcionará correctamente este programa? No, terminará con el error "invalid pointer access" en la línea printf(shape.name); //ERROR (!?) , a pesar de que parece que tenemos garantizada la creación de un objeto en la función TestShapePointer. La cuestión es que en realidad se pasó una referencia NULL en lugar de shape. Es decir, ¡la forma dentro de la función y la forma pasada son objetos diferentes! Por lo tanto, después de salir de la función, shape sigue siendo igual a NULL, y el puntero shape dentro de la función se pierde (se borra en la pila). Por lo tanto.
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CFoo
{
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CBar : public CFoo
{
public:
void func(int x) { Print("Hello from Bar ",x); }
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void func(CFoo *foo)
{
//--- llamada con casting directamente de puntero a tipo base
((CBar*)foo).func(1);
//--- llamada con conversión al tipo de destino y guardando una copia del puntero con el tipo requerido
CBar *b=(CBar *)foo;
b.func(2);
//--- borrar la clase creada dinámicamentedelete foo;
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnStart()
{
func(new CBar);
}
//+------------------------------------------------------------------+
Todavía no entiendo acerca de los punteros y referencias en MQL5 y ahora en MQL4. ¿Cuál es la diferencia entre pasar por referencia y puntero a excepción de código extra? Hay una diferencia en C ++, pero ¿qué es aquí? Si no es difícil de escribir más detallada.
Pasar por referencia requiere que el objeto pasado por referencia sea inicializado. Pasar por puntero no tiene esta restricción:
Al llamar a la función TestShapeRef, el código se bloqueará porque la forma no está inicializada. Por otro lado, dentro de la función TestShapePointer, se requieren comprobaciones constantes de si el objeto pasado está inicializado o no. Por lo tanto, siga la regla imprírica:
Hay otro matiz sutil que debe tener en cuenta. Considere el ejemplo anterior:
¿Funcionará correctamente este programa? No, terminará con el error "invalid pointer access" en la línea printf(shape.name); //ERROR (!?) , a pesar de que parece que tenemos garantizada la creación de un objeto en la función TestShapePointer. La cuestión es que en realidad se pasó una referencia NULL en lugar de shape. Es decir, ¡la forma dentro de la función y la forma pasada son objetos diferentes! Por lo tanto, después de salir de la función, shape sigue siendo igual a NULL, y el puntero shape dentro de la función se pierde (se borra en la pila). Por lo tanto.¿Es posible crear un array con objetos de distintos tipos?
Tomemos este ejemplo:
//---
¿Cómo acceder a los métodos de las clases heredadas?
¿Cómo acceder a los métodos de las clases herederas?
¿Has probado a lanzar un tipo de objetivo?
No. Es la primera vez que oigo hablar de ello. ¿Dónde puedo leer sobre ello?
La conversión de tipo habitual, he aquí un ejemplo:
¿Has probado a hacer un casting al tipo de destino?
Mierda, ¿y hablas de seguridad lingüística después de eso?
¿No sería mejor utilizar el polimorfismo?
Es algo así: