Форвардное объявление не работает должным образом в 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();
     }
  };

Все еще не идеал, но, по крайней мере, он компилируется.

Он должен работать,
по крайней мере, я не вижу проблем, если занятия в одном месте:

Другие вопросы по тегам