前向声明在 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;
};

注意:DrawMarket 文件的包含放在 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.
};

为了避免加载包含文件时出现任何编译器错误,我进行了前向声明,但编译仍然失败。

错误如下(取决于我要编译的文件):

在最新版本 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();
     }
  };

仍然不理想,但至少可以编译。