0

我在以下层次结构中的 4 个不同文件中有 4 个类:

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

括号中是类指针,类实现为类变量。

所以 Draw 和 Market 类扩展了 Chart,Chart 扩展了 Terminal。虽然我仍然想定义一些类指针,但终端类本身具有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 个警告)

    '终端' - 结构未定义 Chart.mqh 8 22

    '图表' - 结构未定义的 Draw.mqh 7 21

    '图表' - 结构未定义 Market.mqh 8 23

  • Chart.mqh(2 个错误,0 个警告)

    '图表' - 结构未定义的 Draw.mqh 7 21

    '图表' - 结构未定义 Market.mqh 8 23

  • Draw.mqh(1 个错误,0 个警告)

    '图表' - 结构未定义 Market.mqh 8 23

  • Market.mqh(1 个错误,0 个警告)

    '图表' - 结构未定义的 Draw.mqh 7 21

在最新版本 1498 中测试。

对于 MQL4 和 MQL5 编译器构建,上述错误是相同的。

以上问题有解决办法吗?我错过了什么?

澄清一下,我的目标是将每个类保存在一个单独的文件中。

4

2 回答 2

0

它应该可以工作,
至少如果课程在一个地方,我认为没有问题:

在此处输入图像描述

于 2017-01-19T07:58:46.350 回答
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();
     }
  };

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

于 2017-01-19T18:21:02.947 回答