MQL4:如何在文件之间分隔类定义?

时间:2020-02-11 16:33:31

标签: mql4 mt4

我希望能够在文件之间拆分MQL4中的类,即拆分为include / .mqh文件中的定义和library / .mq4文件中的实现。我们该怎么做-我不断收到编译错误(“'function_name'必须具有主体”)?

例如我可以在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文件中: What is the correct way to define MQL4 "#import of static class methods"?。有什么办法解决吗?

1 个答案:

答案 0 :(得分:0)

Ex Ovo Omnia在https://www.mql5.com/en/forum/157907#comment_3808727指出了我找到的最佳答案。

详细信息在https://www.mql5.com/en/articles/362#expclass的第二部分(“ 2.导出类的隐藏实现”)中。请注意,如果将扩展名更改为.mq4并更新#,则那里的文件也可以在MQL4中使用。 include / #import语句。

总结:在包含文件中定义一个基类/父类,然后在库文件中定义并实现一个派生/子类。然后在专家文件中,可以将指向基类的指针转换为派生类的指针,以利用隐藏的派生类方法。

感谢Daniel Kniaz对CArrayObj类(https://www.mql5.com/en/docs/standardlibrary/datastructures/carrayobj)的建议。我发现如果您希望使用所有元素都属于同一类型的数组(例如,整数元素的ArrayList类对象)或遵循某些预定义结构(例如CTrade)的数组,但是如果您的数组具有自定义数组,那么这是很好的多种不同类型的结构。