如何在MQL中定义一个类的静态指针?

时间:2018-01-15 02:24:30

标签: pointers compiler-errors static mql5

我有以下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类,它用作定时器来分析函数花费的时间。 original version使用定时器列表分别在每次调用时存储时间,但是,代码已经过简化,以提供最小的工作示例,并专注于实际的编译问题。

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

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

编译失败:

  

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

当我删除static字时,代码编译得很好。

但是它没有帮助我,因为我想将这个变量定义为一个指向类的静态指针,因为我不希望每次反复调用相同的函数时都会破坏我的对象,所以定时器可以添加到列表中,以后可以读取。我真的不明白为什么MQL编译器会阻止编译上面的代码。我也相信这种语法在以前的版本中运行良好。

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

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

1 个答案:

答案 0 :(得分:2)

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