Форвардное объявление не работает должным образом в MQL

У меня есть 4 класса в 4 разных файлах в следующей иерархии:

|-- Terminal (Chart)
|   |-- Chart (Draw, Market)
|   |   |-- Draw
|   |   |-- Market

В скобках указаны указатели классов, которые класс реализует как переменные класса.

Таким образом, классы Draw и Market расширяют Chart, который расширяет Terminal. Хотя я все еще хочу определить некоторый указатель класса, поэтому сам класс Terminal имеет 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.
};

Чтобы избежать каких-либо ошибок компилятора во время загрузки включений, я делаю предварительную декларацию, однако компиляция все еще не выполняется.

Ошибки следующие (в зависимости от того, какой файл я пытаюсь скомпилировать):

  • #P8#
    #P9# #P10# #P11#
  • #P12# <цитата> #P13# #P14#
  • #P15# <блочная цитата> #P16#
  • #P17# <блочная цитата> #P18#

Протестировано в последней сборке 1498.

Описанные выше ошибки одинаковы для сборок компилятора MQL4 и MQL5.

Есть ли решение вышеуказанной проблемы? Я что-то упускаю?

Чтобы уточнить, моя цель - сохранить каждый класс в отдельном файле.


person kenorb    schedule 18.01.2017    source источник


Ответы (2)


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

введите здесь описание изображения

person Daniel Kniaz    schedule 19.01.2017
comment
К сожалению, они мне нужны в отдельных файлах. Проблема здесь в том, чтобы скомпилировать классы, которые хранятся отдельно, и включать их правильным образом. - person kenorb; 19.01.2017

Невозможно наследовать класс от предварительного объявления.

Таким образом, файлы должны быть включены после определения класса.

Мне предложили следующую структуру:

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();
     }
  };

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

person kenorb    schedule 19.01.2017