前向声明在MQL中没有按预期工作

时间:2017-01-18 20:34:58

标签: compiler-errors include mql4 mql5

我在以下层次结构中的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;
};

注意:DrawMarket文件的包含位于类定义之后,只是为了确保在加载这些包含时定义当前的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编译器构建都是相同的。

上述问题有解决方案吗?我错过了什么?

为了澄清,我的目标是将每个班级保存在一个单独的文件中。

2 个答案:

答案 0 :(得分:0)

它应该有效,至少我认为如果班级在一个地方没有问题:

enter image description here

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

仍然不理想,但至少它会编译。