前向声明在 MQL 中无法按预期工作
Forward declaration doesn't work as expected in MQL
我在以下层次结构中的 4 个不同文件中有 4 个 classes:
|-- Terminal (Chart)
| |-- Chart (Draw, Market)
| | |-- Draw
| | |-- Market
括号中是 class 指针,class 作为 class 变量实现。
所以 Draw and Market classes 扩展了 Chart,而 Chart 又扩展了 Terminal。虽然我仍然想定义一些 class 指针,所以终端 class 本身有 chart
指向图表 class.
的指针
文件是:
Terminal.mqh
// Forward declaration.
class Chart;
class Terminal;
// Includes.
#include "Chart.mqh"
class Terminal {
protected:
Chart *chart;
};
Chart.mqh
// Forward declaration.
class Chart;
class Terminal;
// Includes.
#include "Terminal.mqh"
class Chart : public Terminal {
protected:
// Includes.
#include "Draw.mqh"
#include "Market.mqh"
// Class variables.
Draw *draw;
Market *market;
};
注意:Draw
和 Market
文件的包含放在 class 定义之后只是为了确保当前的 Chart
class在加载这些包含时定义,就在声明使用它的变量之前。
Draw.mqh
// Forward declaration.
class Chart;
class Draw;
#include "Chart.mqh"
class Draw : public Chart {
// Some drawing methods.
};
Market.mqh
// Forward declaration.
class Chart;
class Market;
// Includes.
#include "Chart.mqh"
class Market : public Chart {
// Some market methods.
};
为了避免加载包含文件时出现任何编译器错误,我进行了前向声明,但编译仍然失败。
错误如下(取决于我要编译的文件):
Terminal.mqh
(3 个错误,0 个警告)
'Terminal' - struct undefined Chart.mqh 8 22
'Chart' - struct undefined Draw.mqh 7 21
'Chart' - struct undefined Market.mqh 8 23
Chart.mqh
(2 个错误,0 个警告)
'Chart' - struct undefined Draw.mqh 7 21
'Chart' - struct undefined Market.mqh 8 23
Draw.mqh
(1 个错误,0 个警告)
'Chart' - struct undefined Market.mqh 8 23
Market.mqh
(1 个错误,0 个警告)
'Chart' - struct undefined Draw.mqh 7 21
在最新版本 1498 中测试。
以上错误对于 MQL4 和 MQL5 编译器构建都是一样的。
以上问题有解决办法吗?我遗漏了什么?
澄清一下,我的目标是将每个 class 保存在一个单独的文件中。
它应该可以工作,
至少我认为如果 类 在一个地方没有问题:
无法从前向声明中继承 class。
因此需要在定义 class 之后包含文件。
有人向我建议了以下结构:
Terminal.mqh
// Forward declaration.
class Chart;
class Terminal;
class Terminal {
protected:
Chart *chart;
};
// Includes.
#include "Chart.mqh"
// Terminal methods implementation
Chart.mqh
class Chart;
class Terminal;
// Includes.
#include "Terminal.mqh"
class Chart: public Terminal
{
protected:
Draw *draw;
Market *market;
public:
void Test()
{
draw.Test();
market.Test();
}
};
#include "Draw.mqh"
#include "Market.mqh"
Draw.mqh
#include "Chart.mqh"
class Draw : public Chart
{
public:
void Test()
{
this.Test();
}
};
Market.mqh
#include "Chart.mqh"
class Market : public Chart
{
public:
void Test()
{
this.Test();
}
};
仍然不理想,但至少可以编译。
我在以下层次结构中的 4 个不同文件中有 4 个 classes:
|-- Terminal (Chart)
| |-- Chart (Draw, Market)
| | |-- Draw
| | |-- Market
括号中是 class 指针,class 作为 class 变量实现。
所以 Draw and Market classes 扩展了 Chart,而 Chart 又扩展了 Terminal。虽然我仍然想定义一些 class 指针,所以终端 class 本身有 chart
指向图表 class.
文件是:
Terminal.mqh
// Forward declaration.
class Chart;
class Terminal;
// Includes.
#include "Chart.mqh"
class Terminal {
protected:
Chart *chart;
};
Chart.mqh
// Forward declaration.
class Chart;
class Terminal;
// Includes.
#include "Terminal.mqh"
class Chart : public Terminal {
protected:
// Includes.
#include "Draw.mqh"
#include "Market.mqh"
// Class variables.
Draw *draw;
Market *market;
};
注意:Draw
和 Market
文件的包含放在 class 定义之后只是为了确保当前的 Chart
class在加载这些包含时定义,就在声明使用它的变量之前。
Draw.mqh
// Forward declaration.
class Chart;
class Draw;
#include "Chart.mqh"
class Draw : public Chart {
// Some drawing methods.
};
Market.mqh
// Forward declaration.
class Chart;
class Market;
// Includes.
#include "Chart.mqh"
class Market : public Chart {
// Some market methods.
};
为了避免加载包含文件时出现任何编译器错误,我进行了前向声明,但编译仍然失败。
错误如下(取决于我要编译的文件):
Terminal.mqh
(3 个错误,0 个警告)'Terminal' - struct undefined Chart.mqh 8 22
'Chart' - struct undefined Draw.mqh 7 21
'Chart' - struct undefined Market.mqh 8 23
Chart.mqh
(2 个错误,0 个警告)'Chart' - struct undefined Draw.mqh 7 21
'Chart' - struct undefined Market.mqh 8 23
Draw.mqh
(1 个错误,0 个警告)'Chart' - struct undefined Market.mqh 8 23
Market.mqh
(1 个错误,0 个警告)'Chart' - struct undefined Draw.mqh 7 21
在最新版本 1498 中测试。
以上错误对于 MQL4 和 MQL5 编译器构建都是一样的。
以上问题有解决办法吗?我遗漏了什么?
澄清一下,我的目标是将每个 class 保存在一个单独的文件中。
它应该可以工作,
至少我认为如果 类 在一个地方没有问题:
无法从前向声明中继承 class。
因此需要在定义 class 之后包含文件。
有人向我建议了以下结构:
Terminal.mqh
// Forward declaration.
class Chart;
class Terminal;
class Terminal {
protected:
Chart *chart;
};
// Includes.
#include "Chart.mqh"
// Terminal methods implementation
Chart.mqh
class Chart;
class Terminal;
// Includes.
#include "Terminal.mqh"
class Chart: public Terminal
{
protected:
Draw *draw;
Market *market;
public:
void Test()
{
draw.Test();
market.Test();
}
};
#include "Draw.mqh"
#include "Market.mqh"
Draw.mqh
#include "Chart.mqh"
class Draw : public Chart
{
public:
void Test()
{
this.Test();
}
};
Market.mqh
#include "Chart.mqh"
class Market : public Chart
{
public:
void Test()
{
this.Test();
}
};
仍然不理想,但至少可以编译。