我在以下层次结构中的4个不同文件中有4个类:
|-- Terminal (Chart)
| |-- Chart (Draw, Market)
| | |-- Draw
| | |-- Market
在括号中是类指针,该类实现为类变量。
因此,Draw和Market类扩展了Chart,它扩展了Terminal。虽然我仍然想要定义一些类指针,所以Terminal类it-self有一个指向Chart类的chart
指针。
文件是:
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
文件的包含位于类定义之后,只是为了确保在加载这些包含时定义当前的Chart
类,就在声明使用它的变量之前。
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个警告)
'终端' - struct undefined Chart.mqh 8 22
'图表' - struct undefined Draw.mqh 7 21
'图表' - struct undefined Market.mqh 8 23
Chart.mqh
(2个错误,0个警告)
'图表' - struct undefined Draw.mqh 7 21
'图表' - struct undefined Market.mqh 8 23
Draw.mqh
(1个错误,0个警告)
'图表' - struct undefined Market.mqh 8 23
Market.mqh
(1个错误,0个警告)
'图表' - struct undefined Draw.mqh 7 21
在最新版本1498中测试。
以上错误对于MQL4和MQL5编译器构建都是相同的。
上述问题有解决方案吗?我错过了什么?
为了澄清,我的目标是将每个班级保存在一个单独的文件中。
答案 0 :(得分:0)
答案 1 :(得分:0)
无法从前向声明继承类。
因此在定义类之后需要包含文件。
我建议使用以下结构:
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();
}
};
仍然不理想,但至少它会编译。