Funciones (métodos) de estructuras

Después de recibir un resultado de la función calculate sería deseable imprimirlo en el registro, pero la función Print no funciona con tipos definidos por el usuario: ellos mismos deben proporcionar una forma de dar salida a la información.

void OnStart()
{
   Settings s = {D'2021.01.01', 1000PRICE_CLOSE8};
   Result r = calculate(s);
   // Print(r);  // error: 'r' - objects are passed by reference only
   // Print(&r); // error: 'r' - class type expected
}

Los comentarios muestran los intentos de llamar a la función Print para la estructura, así como lo que sigue después. El primer error se debe a que las instancias de estructura son objetos, y los objetos deben pasarse a las funciones por referencia. Al mismo tiempo, Print espera un valor (uno o varios). El uso de un ampersand delante del nombre de la variable en la segunda llamada Print significa en MQL5 que se ha recibido el puntero y no es una referencia como se podría pensar. Los punteros en MQL5 sólo se admiten para objetos de clase (no estructuras), de ahí el segundo error «tipo de clase esperado». Aprenderemos más sobre los punteros en el próximo capítulo (véase Clases e interfaces).

Podríamos especificar en la llamada Print todos los miembros de la estructura por separado (utilizando la desreferenciación), pero esto es bastante problemático.

Para aquellos casos en los que sea necesario procesar el contenido de la estructura de una forma especial se pueden definir funciones dentro de la estructura. La sintaxis de la definición no difiere de las funciones de contexto global conocidas, pero la definición en sí se encuentra dentro del bloque de estructura.

Estas funciones se denominan métodos. Dado que están situados en el contexto del bloque correspondiente, se puede acceder desde ellos a los campos de la estructura sin el operador de desreferenciación. Escribamos a modo de ejemplo la implementación de la función print en la estructura Result.

struct Result
{
   ...
   void print()
   {
      Print(probability" "direction" "status);
      ArrayPrint(coef);
   }
};

Llamar a un método de la instancia de la estructura es tan sencillo como leer su campo: se utiliza el mismo operador '.'.

void OnStart()
{
   Settings s = {D'2021.01.01', 1000PRICE_CLOSE8};
   Result r = calculate(s);
   r.print();
}

En el capítulo sobre las clases se tratarán los métodos con más detalle.