gpt4 book ai didi

pointers - 如何在MQL中定义指向类的静态指针?

转载 作者:行者123 更新时间:2023-12-02 10:51:16 26 4
gpt4 key购买 nike

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

编译失败并显示:

'Timer' - local variables cannot be used TestProfiler.mqh 30 30



当我放下static字时,代码可以正常编译。

但这无济于事,因为我想将此变量定义为指向类的静态指针,因为我不想每次重复调用同一函数时都销毁我的对象,因此计时器可以被添加到列表中,以后可以阅读。我真的不明白为什么MQL编译器会阻止编译以上代码。我也相信此语法在以前的版本中效果很好。

我正在使用MetaEditor 5.00内部版本1601(2017年5月)。

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

最佳答案

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

关于pointers - 如何在MQL中定义指向类的静态指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48256212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com