文章 "图形界面 XI: 集成标准图形库 (统合构建 16)" - 页 8 12345678910 新评论 Pavel Kolchin 2019.10.11 18:35 #71 Oleksii Chepurnyi: 我试着更改 ElementBase.mqh 文件,但它骂得更凶了。 Oleksii Chepurnyi 2019.10.11 21:45 #72 Pavel Kolchin:我试着更改 ElementBase.mqh 文件,但它骂得更凶了。 ElementBase.mqh 和 Element.mqh 都需要更改。 Andrey Khatimlianskii 2019.10.11 23:24 #73 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; } Oleksii Chepurnyi 2019.10.12 11:55 #74 Andrey Khatimlianskii:1.不编译此类代码是否正确?2.除了上述错误外,这段代码是否还会产生 "已废弃的行为,隐藏方法调用将在未来的 MQL 编译器版本中禁用 TestCompiler.mq5 27 18 "的警告? 也许在有关新版本终端的主题中询问这个问题更好?) 我想他们会更快回答 ) 警告似乎符合编译器的新逻辑,但我不明白关于私有成员的问题,它仍然是公有的...... Pavel Kolchin 2019.10.12 15:48 #75 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); Oleksii Chepurnyi 2019.10.12 19:47 #76 Pavel Kolchin:在 ElementBase.mqh 中很明显,您用 "Set "替换了 "Is"(但不清楚为什么我们可以这样做)。但在 Element.mqh 中还有一行 现在 MQ 不喜欢相同的名称(变量、方法等):) 我们只是更改了方法的名称(为什么不呢?) 我们不想改变任何东西--我们等待作者重做一切 ) ) Pavel Kolchin 2019.10.12 20:46 #77 Oleksii Chepurnyi: 作者可能已经 "完成 "了这个项目,您能否具体说明在哪些行中应写哪些内容,以便编译器不会骂人,当然最好是为人们提供正统的(经更正的)文件(ElementBase.mqh 和 Element.mqh 中的 文件)? Oleksii Chepurnyi 2019.10.12 23:31 #78 1.我现在正在做另一个项目。 2.我对库做了很大改动 ) 除了ElementBase.mqh 和 Element.mqh 中的改动外,您还应该查看所有元素,也许那里也有这些方法。 Andrey Khatimlianskii 2019.10.14 18:20 #79 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(); } 但这当然不是解决办法。 Andrey Khatimlianskii 2019.10.14 18:24 #80 @Ilyas,没有转换为 CA 的选择吗? 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我试着更改 ElementBase.mqh 文件,但它骂得更凶了。
我试着更改 ElementBase.mqh 文件,但它骂得更凶了。
ElementBase.mqh 和 Element.mqh 都需要更改。
在最近的版本中,我们为编译器添加了一条信息,用于处理子代中重载 祖先方法的 情况:
示例
在本例中,父类 SFoo 的 func(int) 函数在子类 SBar 中被调用,因为编译器没有在子类中找到该函数。 子类只有 func(double) 函数,编译器试图在继承树中找到一个带有合适参数的函数。
也就是说,MQL5 编译器执行的是重载,而不是覆盖子代中的方法。在语言开发之初,MQL5 编译器的这种放宽并不重要。但将来可能会发生变化,因此现在向 MQL5 程序的开发人员发出明确警告,要求他们考虑并更正其代码。
严格来说,重载是一个更宽泛的概念,您可以在互联网
上搜索重载和重载之间的区别。
1.不编译此类代码是否正确?
2.2. 这段代码除了上述错误外,还产生了 "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18 "的警告,这是否正确?
1.不编译此类代码是否正确?
2.除了上述错误外,这段代码是否还会产生 "已废弃的行为,隐藏方法调用将在未来的 MQL 编译器版本中禁用 TestCompiler.mq5 27 18 "的警告?
也许在有关新版本终端的主题中询问这个问题更好?) 我想他们会更快回答 )
警告似乎符合编译器的新逻辑,但我不明白关于私有成员的问题,它仍然是公有的......
ElementBase.mqh 和 Element.mqh 都需要更改
在 ElementBase.mqh 中很明显,您用 "Set "替换了 "Is"(但不清楚为什么我们可以这样做)。
但在 Element.mqh 中还有一行
在 ElementBase.mqh 中很明显,您用 "Set "替换了 "Is"(但不清楚为什么我们可以这样做)。
但在 Element.mqh 中还有一行
现在 MQ 不喜欢相同的名称(变量、方法等):)
我们只是更改了方法的名称(为什么不呢?)
我们不想改变任何东西--我们等待作者重做一切 ) )
作者可能已经 "完成 "了这个项目,您能否具体说明在哪些行中应写哪些内容,以便编译器不会骂人,当然最好是为人们提供正统的(经更正的)文件(ElementBase.mqh 和 Element.mqh 中的 文件)?
1.我现在正在做另一个项目。
2.我对库做了很大改动 )
除了ElementBase.mqh 和 Element.mqh 中的改动外,您还应该查看所有元素,也许那里也有这些方法。
也许在有关新版终端的主题中提问更好?) 我想他们会更快回答 )
警告似乎符合编译器的新逻辑,但我不明白关于私有成员的问题,它仍然是公用的...
我找到了解决方法:
关于交易、自动交易系统和测试交易策略的论坛
新版 MetaTrader 4 第 1170 版
fxsaber, 2019.09.06 09:39 pm.
我认为 MT5 中建议的选项是一种创新,也应该添加到 MT4 中。
但是,如果用老式方法编写代码,它在任何地方都能工作。
我的例子就是这样的:
CC(void) { ((CA)m_b).func(); }但这当然不是解决办法。
@Ilyas,没有转换为 CA 的选择吗?