MQL4: Как мы можем разделить определение класса по файлам? - PullRequest
0 голосов
/ 11 февраля 2020

Я хотел бы иметь возможность разбивать классы в MQL4 по файлам, то есть на определение в файле include / .mqh и реализацию в файле библиотеки / .mq4. Как мы это делаем - я продолжаю получать ошибки компиляции («имя-функции должно иметь тело»)?

Например, я могу взять подмножество кода в https://docs.mql4.com/basis/oop/class_templates и поместите определение в файл .mqh:

#import "library.ex4"

//+------------------------------------------------------------------+
//| Class for a free access to an array element               |
//+------------------------------------------------------------------+
template<typename T>
class TSafeArray
  {
protected:
   T                 m_array[];
public:
   //--- operator for accessing the array element by index
   T                 operator[](int index);
  };

#import

и поместите реализацию в файл .mq4 (называемый library.mq4):

#property library

//+------------------------------------------------------------------+
//| Receiving an element by index                           |
//+------------------------------------------------------------------+
template<typename T>
T TSafeArray::operator[](int index)
  {
   static T invalid_value;
//---
   int max=ArraySize(m_array)-1;
   if(index<0 || index>=ArraySize(m_array))
     {
      PrintFormat("%s index %d is not in range (0-%d)!",__FUNCTION__,index,max);
      return(invalid_value);
     }
//---
   return(m_array[index]);
  }

Это было задано ранее, но Основной ответ поместить определение и реализацию в файл .mqh: Как правильно определить MQL4 "#import of stati c методы класса"? . Есть ли способ обойти это?

1 Ответ

0 голосов
/ 17 февраля 2020

Лучший ответ, который я нашел, был указан Ex Ovo Omnia на https://www.mql5.com/en/forum/157907#comment_3808727.

Подробности во втором разделе («2. Экспорт скрытой реализации класса»). ) в https://www.mql5.com/en/articles/362#expclass. Обратите внимание, что файлы там также работают в MQL4, если вы измените расширения на .mq4 и обновите операторы #include / #import.

В итоге: определите базовый / родительский класс во включаемом файле, затем определите и реализуйте производный / дочерний класс в библиотечном файле.В файле эксперта указатель на базовый класс затем может быть приведен к указателю производного класса, чтобы использовать методы скрытого производного класса.

Спасибо Дэниелу Князу за предложение о классе CArrayObj (https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayobj). Я считаю, что это хорошо, если вы будете sh использовать массивы, где все элементы относятся к одному типу (например, объект типа ArrayList целочисленных элементов) или если они следуют определенным предопределенным структурам (например, CTrade), но не в том случае, если ваши массивы имеют настраиваемую структуру, состоящую из нескольких различных ypes.

...