结构体中的函数(方法)

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 仅支持类对象(而不支持结构体)的指针,因此出现了第二个错误“应为类类型”。我们将在下一章深入学习有关指针的知识(参见 类和接口)。

我们可以在 Print 调用中分别指定结构体的所有成员(使用取消引用),但这相当麻烦。

如果需要以特殊方式处理结构体的内容,可以在结构体内部定义函数。定义的语法与我们熟悉的全局上下文函数并无不同,但定义本身位于结构块内部。

这些函数称为方法。由于这些函数位于相应代码块的上下文中,因此无需取消引用运算符即可从方法中访问结构体的字段。例如,我们在 Result 结构体中编写 print 函数的实现。

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();
}

关于“类”的章节 将对方法进行更详细的介绍。