文章 "图形界面 XI: 集成标准图形库 (统合构建 16)" - 页 8

 
Oleksii Chepurnyi:

我试着更改 ElementBase.mqh 文件,但它骂得更凶了。

 
Pavel Kolchin:

我试着更改 ElementBase.mqh 文件,但它骂得更凶了。

ElementBase.mqh 和 Element.mqh 都需要更改。

 
MetaQuotes Software Corp.:

在最近的版本中,我们为编译器添加了一条信息,用于处理子代中重载 祖先方法的 情况:

示例

在本例中,父类 SFoo 的 func(int) 函数在子类 SBar 中被调用,因为编译器没有在子类中找到该函数。 子类只有 func(double) 函数,编译器试图在继承树中找到一个带有合适参数的函数。

也就是说,MQL5 编译器执行的是重载,而不是覆盖子代中的方法。在语言开发之初,MQL5 编译器的这种放宽并不重要。但将来可能会发生变化,因此现在向 MQL5 程序的开发人员发出明确警告,要求他们考虑并更正其代码。

严格来说,重载是一个更宽泛的概念,您可以在互联网
上搜索重载和重载之间的区别。

1.不编译此类代码是否正确?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // 没有这一行将无法编译
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}
'CA::func' - cannot access private member function      TestCompiler.mq5        27      18
   see declaration of 'CA::func'        TestCompiler.mq5        13      8
1 error(s), 0 warning(s)                2       1


2.2. 这段代码除了上述错误外,还产生了 "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18 "的警告,这是否正确?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // 没有这一行将无法编译
                bool func( int a ) { return(true); };
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

1.不编译此类代码是否正确?


2.除了上述错误外,这段代码是否还会产生 "已废弃的行为,隐藏方法调用将在未来的 MQL 编译器版本中禁用 TestCompiler.mq5 27 18 "的警告


也许在有关新版本终端的主题中询问这个问题更好?) 我想他们会更快回答 )

警告似乎符合编译器的新逻辑,但我不明白关于私有成员的问题,它仍然是公有的......

 
Oleksii Chepurnyi:

ElementBase.mqh 和 Element.mqh 都需要更改

在 ElementBase.mqh 中很明显,您用 "Set "替换了 "Is"(但不清楚为什么我们可以这样做)。

virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
bool              IsAvailable(void)                         const { return(m_is_available);               }

但在 Element.mqh 中还有一行

//--- 项目可用性
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

在 ElementBase.mqh 中很明显,您用 "Set "替换了 "Is"(但不清楚为什么我们可以这样做)。

但在 Element.mqh 中还有一行

现在 MQ 不喜欢相同的名称(变量、方法等):)

我们只是更改了方法的名称(为什么不呢?)

我们不想改变任何东西--我们等待作者重做一切 ) )

 
Oleksii Chepurnyi:

作者可能已经 "完成 "了这个项目,您能否具体说明在哪些行中应写哪些内容,以便编译器不会骂人,当然最好是为人们提供正统的(经更正的)文件(ElementBase.mqh 和 Element.mqh 中的 文件)?

 

1.我现在正在做另一个项目

2.我对库做了很大改动 )

除了ElementBase.mqh 和 Element.mqh 中的改动外,您还应该查看所有元素,也许那里也有这些方法。

 
Oleksii Chepurnyi:

也许在有关新版终端的主题中提问更好?) 我想他们会更快回答 )

警告似乎符合编译器的新逻辑,但我不明白关于私有成员的问题,它仍然是公用的...

我找到了解决方法:

关于交易、自动交易系统和测试交易策略的论坛

新版 MetaTrader 4 第 1170 版

fxsaber, 2019.09.06 09:39 pm.

我认为 MT5 中建议的选项是一种创新,也应该添加到 MT4 中。

但是,如果用老式方法编写代码,它在任何地方都能工作。

     void           Test(const bool test){((A)b).Test(test);}

我的例子就是这样的:

CC(void) { ((CA)m_b).func(); }


但这当然不是解决办法。

 

@Ilyas,没有转换为 CA 的选择吗?