0

我有以下 MQL 代码:

class Collection {
  public: void *Get(void *_object) { return NULL; }
};

class Timer      {
  protected:
    string name;
    uint start, end;
  public:
    void Timer(string _name = "") : name(_name) { };
    void TimerStart() { start = GetTickCount(); }
    void TimerStop()  { end = GetTickCount();   }
};

class Profiler {
  public:
    static Collection *timers;
    static ulong min_time;
    void Profiler()  { };
    void ~Profiler() { Deinit(); };
    static void Deinit() { delete Profiler::timers; };
};

// Initialize static global variables.
Collection *Profiler::timers = new Collection();
ulong Profiler::min_time = 1;

void main() {
  // Define local variable.
  static Timer *_timer = new Timer(__FUNCTION__); // This line doesn't.
  //Timer *_timer = new Timer(__FUNCTION__); // This line works.

  // Start a timer.
  ((Timer *) Profiler::timers.Get(_timer)).TimerStart();
  /* Some code here. */
  // Stop a timer.
  ((Timer *) Profiler::timers.Get(_timer)).TimerStop();
}

它定义了一个 Timer 类,该类用作计时器来分析函数花费了多长时间。原始版本使用一个计时器列表来分别存储每次调用的时间,但是,代码已被简化以提供最小的工作示例并专注于实际的编译问题。

问题是当我使用以下行来初始化静态变量时:

static Timer *_timer = new Timer(__FUNCTION__); // Line 30.

编译失败:

'计时器' - 不能使用局部变量 TestProfiler.mqh 30 30

当我放弃static单词时,代码编译得很好。

但这对我没有帮助,因为我想将此变量定义为指向该类的静态指针,因为我不想每次一遍又一遍地调用同一个函数时都销毁我的对象,因此计时器可以被添加到以后可以阅读的列表中。我真的不明白为什么 MQL 编译器会阻止编译上述代码。我也相信这种语法在以前的版本中运行良好。

我正在使用 MetaEditor 5.00 build 1601(2017 年 5 月)。

我的静态变量声明有什么问题,如何更正它,以便它可以指向 Timer 类?

4

1 回答 1

2

关键字static在 MQL4/5 中有两种不同的含义:它表示一个类的成员是静态的(这很明显),它还表示一个变量是静态的……例如,如果您有一个仅使用的变量在一个函数中,您可能不需要全局声明它,而是将其声明为静态。您可以在 mql5.com 上关于新柱的文章中找到一个isNewBar()函数示例。static datetime lastBar=0;此类函数中的此关键字表示该变量在函数完成后不会被删除,而是保留在内存中并用于下一次调用。而且,如果您需要OnTick()函数中的变量-将其设置为静态没有意义,请在全局范围内声明它。

于 2018-01-15T10:00:43.920 回答