我有以下 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 类?