Функции (методы) в структурах

После получения результата из функции calculate было бы желательно его вывести в журнал, но функция Print не работает с пользовательскими типами: они должны сами предоставить способ отображения.

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
}

В комментариях представлены попытки вызвать функцию Print для структуры и что из этого получается. Первая ошибка вызвана тем, что экземпляры структур являются объектами, а объекты должны передаваться в функции по ссылке. Вместе с тем Print ожидает значение (одно или несколько). Использование амперсанда перед именем переменной во втором вызове Print обозначает в MQL5 получение указателя, а не ссылки, как можно было бы подумать. Указатели в MQL5 поддерживаются только для объектов классов (но не структур), отсюда и вторая ошибка "ожидается класс" ("class type expected"). Мы изучим указатели в следующей главе (см. Классы и интерфейсы).

Мы могли бы указать в вызове Print все члены структуры по отдельности (с помощью разыменования), но это неудобно.

Для тех случаев, когда необходимо особым образом обработать содержимое структуры, предусмотрена возможность определить внутри структуры функции. Синтаксис их определения ничем не отличается от знакомых нам функций глобального контекста, но само определение располагается внутри блока структуры.

Подобные функции называются методами. Поскольку они расположены в контексте соответствующего блока, из них можно обращаться к полям структуры без оператора разыменования. Напишем для примера реализацию функции print в структуре Result.

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

Вызвать метод экземпляра структуры также просто как прочитать её поле: используется тот же оператор '.'.

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

Более подробно о методах будет рассказано в Главе про классы.