Форвардное объявление не работает должным образом в MQL
У меня есть 4 класса в 4 разных файлах в следующей иерархии:
|-- Terminal (Chart)
| |-- Chart (Draw, Market)
| | |-- Draw
| | |-- Market
В скобках указаны указатели классов, которые класс реализует как переменные класса.
Так классы Draw и Market расширяют 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 предупреждений)"Терминал" - структура неопределенная Chart.mqh 8 22
'Chart' - структура не определена Draw.mqh 7 21
'Диаграмма' - структура не определена Market.mqh 8 23
Chart.mqh
(2 ошибки, 0 предупреждений)'Chart' - структура не определена Draw.mqh 7 21
'Диаграмма' - структура не определена Market.mqh 8 23
Draw.mqh
(1 ошибка (-и), 0 предупреждение (-я))'Диаграмма' - структура не определена Market.mqh 8 23
Market.mqh
(1 ошибка (-и), 0 предупреждение (-я))'Chart' - структура не определена Draw.mqh 7 21
Проверено в последней сборке 1498.
Вышеуказанные ошибки одинаковы для компиляторов MQL4 и MQL5.
Есть ли решение вышеуказанной проблемы? Я что-то пропустил?
Чтобы уточнить, моя цель состоит в том, чтобы держать каждый класс в отдельном файле.
2 ответа
Невозможно унаследовать класс от прямого объявления.
Таким образом, файлы должны быть включены после определения класса.
Следующая структура была предложена мне:
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();
}
};
Все еще не идеал, но, по крайней мере, он компилируется.