MQL5中的OOP问题 - 页 44 1...373839404142434445464748495051...96 新评论 Sergey Dzyublik 2020.04.18 15:23 #431 Igor Makanu: 我不同意。 请更新你的知识,了解什么是 "赋值运算符 "和 "复制构造器",它们有什么不同,何时以及如何调用它们(显式和隐式)。 在代码中,你用黄色标出了一个局部变量从一个函数中的返回,其结果是调用默认的复制构造器(不要与赋值运算符混淆)。 不幸的是,什么是 "完整的数据类型 "并不完全清楚,也不清楚你想用你的代码来证明什么......。 我再重复一遍:"默认的MQL赋值运算符返回void;" struct A{ int x,y; }; void OnStart(){ A a, b; Print(typename(a = b)); // void } Igor Makanu 2020.04.18 15:28 #432 Koldun Zloy: 错了。 只要定义你的operator=,返回这个,就能看到区别。 当赋值的结果再次被分配时,你可以看到差异。 如果我定义operator=,我就偏离了我最初的目标,即调用默认的::=。 这似乎是一个无法解决的问题。 谢尔盖-迪尤布利 克。 不幸的是,什么是 "完整的数据类型 "并不十分清楚,也不清楚你想用你的代码来证明什么... full是完整的--数据结构 将被保留,如果我增加新的字段,就不需要控制结构的复制了 Koldun Zloy 2020.04.18 15:32 #433 Igor Makanu: 如果我定义运算符=,我就偏离了我最初的目标,即调用默认的::=。 你真的需要这样的任务吗? b = c = a; Sergey Dzyublik 2020.04.18 15:48 #434 Igor Makanu: complete是完整的--数据结构 将被保留,如果增加了新的字段,就不需要控制结构的复制了 然后,根据你的术语,调用默认赋值运算符可以得到一个 "不完整的数据类型"。 2019.05.03的错误从未被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395 Igor Makanu 2020.04.18 16:46 #435 Koldun Zloy: 你真的需要这样一项任务吗? 纯粹从理论上讲,我想知道它是否是一个 "新实体",而不是一个运算符= =。 我根本不需要它的实际用途,我把它放在2个运营商中没有问题。 谢尔盖-迪尤布利 克。 然后,根据你的术语,调用默认赋值运算符可以得到 "不完整的数据类型"。 2019.05.03的bug一直没有被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395 "我的术语 "是问,没有投诉。 但使用默认操作符=的意义在于,只描述结构中的字段是很方便的,所有东西都被复制了,甚至包括数组的尺寸(尽管只是尺寸增加--工作原理与ArrayCopy()相同)。 好吧,如果它是一个bug,它一定是到目前为止。 Igor Makanu 2020.04.19 19:48 #436 这个问题纯粹是理论性的。 可能在SB中看到过这样的构造器调用。 class A{ public: A(){Print(__FUNCTION__);} }; class B{ public: A a1,a2; B():a1(),a2() { Print(__FUNCTION__); } }; 这个代码会有什么不同。 class A{ public: A(){Print(__FUNCTION__);} }; class B{ public: A a1,a2; B() { Print(__FUNCTION__); } }; 我已经解压了,我没有看到任何区别,那么请具体一点--什么或者为什么我们可以对a1和a2对象使用强制构造函数调用? 第一个选项的 "便利 "是什么? Maxim Kuznetsov 2020.04.19 19:57 #437 Igor Makanu: 这个问题纯粹是理论性的。 可能在SB中看到过这样的构造器调用。 这个代码会有什么不同。 我已经解压了,我没有看到任何区别,那么具体一点--有什么好处或者为什么我们可以对对象a1和a2使用强制构造函数调用? 第一个选项的 "便利 "是什么? 构造函数可以有参数,它们必须以某种方式被传递。 也就是说,在没有参数之前,没有任何区别,但如果你使用构造函数A(int arg),那就不一样了 Igor Makanu 2020.04.19 20:09 #438 Maxim Kuznetsov: 构造函数有参数,它们必须以某种方式被传递。 也就是说,在没有参数之前,区别不大。 但如果你有构造函数A(int arg),那就不一样了 你可能是对的--这取决于目的。 我只是在第一个变体上遇到了困难,当时我想使用B类的 2个构造函数,在两个构造函数中都收到了重复的代码--我把它们删除了,得到的只是第一个变体中的一部分代码,问题出现了,我在哪里看到了它,为什么我这样写)))。 Sergey Dzyublik 2020.04.19 22:27 #439 Igor Makanu: 是什么原因使对象a1和a2的构造函数可以被强制使用? 正确的过程名称不是 "强制构造函数调用a1和a2",而是类(非静态)字段的初始化。 在以下情况下,必须要有。 - 使用常数类字段。- 没有为类字段提供默认的构造函数。- 除了通过构造函数调用外,没有任何其他初始化对象的方式(例如,删除赋值运算符)。-... Dmitry Fedoseev 2020.04.20 00:28 #440 谁能解释一下,这种初始化字段的方式比这个好吗? CArray::CArray(void) : m_step_resize(16), m_data_total(0), m_data_max(0), m_sort_mode(-1) { } 是比这更好的。 CArray::CArray(void) { m_step_resize=16; m_data_total=0; m_data_max=0; m_sort_mode=-1; } 那到底有什么意义呢? 1...373839404142434445464748495051...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不同意。
请更新你的知识,了解什么是 "赋值运算符 "和 "复制构造器",它们有什么不同,何时以及如何调用它们(显式和隐式)。
在代码中,你用黄色标出了一个局部变量从一个函数中的返回,其结果是调用默认的复制构造器(不要与赋值运算符混淆)。
不幸的是,什么是 "完整的数据类型 "并不完全清楚,也不清楚你想用你的代码来证明什么......。
我再重复一遍:"默认的MQL赋值运算符返回void;"
错了。
只要定义你的operator=,返回这个,就能看到区别。
当赋值的结果再次被分配时,你可以看到差异。
如果我定义operator=,我就偏离了我最初的目标,即调用默认的::=。
这似乎是一个无法解决的问题。
不幸的是,什么是 "完整的数据类型 "并不十分清楚,也不清楚你想用你的代码来证明什么...
full是完整的--数据结构 将被保留,如果我增加新的字段,就不需要控制结构的复制了
如果我定义运算符=,我就偏离了我最初的目标,即调用默认的::=。
你真的需要这样的任务吗?
complete是完整的--数据结构 将被保留,如果增加了新的字段,就不需要控制结构的复制了
然后,根据你的术语,调用默认赋值运算符可以得到一个 "不完整的数据类型"。
2019.05.03的错误从未被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395
你真的需要这样一项任务吗?
纯粹从理论上讲,我想知道它是否是一个 "新实体",而不是一个运算符= =。
我根本不需要它的实际用途,我把它放在2个运营商中没有问题。
然后,根据你的术语,调用默认赋值运算符可以得到 "不完整的数据类型"。
2019.05.03的bug一直没有被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395
"我的术语 "是问,没有投诉。
但使用默认操作符=的意义在于,只描述结构中的字段是很方便的,所有东西都被复制了,甚至包括数组的尺寸(尽管只是尺寸增加--工作原理与ArrayCopy()相同)。
好吧,如果它是一个bug,它一定是到目前为止。
这个问题纯粹是理论性的。
可能在SB中看到过这样的构造器调用。
这个代码会有什么不同。
我已经解压了,我没有看到任何区别,那么请具体一点--什么或者为什么我们可以对a1和a2对象使用强制构造函数调用?
第一个选项的 "便利 "是什么?
这个问题纯粹是理论性的。
可能在SB中看到过这样的构造器调用。
这个代码会有什么不同。
我已经解压了,我没有看到任何区别,那么具体一点--有什么好处或者为什么我们可以对对象a1和a2使用强制构造函数调用?
第一个选项的 "便利 "是什么?
构造函数可以有参数,它们必须以某种方式被传递。
也就是说,在没有参数之前,没有任何区别,但如果你使用构造函数A(int arg),那就不一样了
构造函数有参数,它们必须以某种方式被传递。
也就是说,在没有参数之前,区别不大。 但如果你有构造函数A(int arg),那就不一样了
你可能是对的--这取决于目的。
我只是在第一个变体上遇到了困难,当时我想使用B类的 2个构造函数,在两个构造函数中都收到了重复的代码--我把它们删除了,得到的只是第一个变体中的一部分代码,问题出现了,我在哪里看到了它,为什么我这样写)))。
是什么原因使对象a1和a2的构造函数可以被强制使用?
正确的过程名称不是 "强制构造函数调用a1和a2",而是类(非静态)字段的初始化。
在以下情况下,必须要有。
谁能解释一下,这种初始化字段的方式比这个好吗?
是比这更好的。
那到底有什么意义呢?