错误、漏洞、问题 - 页 2358 1...235123522353235423552356235723582359236023612362236323642365...3184 新评论 Alexey Navoykov 2018.12.24 15:10 #23571 Ilya Malev: 尽管即使该对象没有虚拟方法,你在访问它的时候仍然应该检查指针的有效性。事实上,这是一个模棱两可的问题。例如,这个检查在C#中始终存在,而在C++中只有在需要时才会出现,这在速度上有优势。 毕竟,如果你调用一个不访问对象字段的方法,那么检查指针就真的没有意义了。 从本质上讲,这样的方法相当于一个静态的方法。 Ilya Malev 2018.12.24 15:14 #23572 Alexey Navoykov:一般来说,这是一个模棱两可的问题。例如,C#总是有这样的检查,而C++只有在需要时才有,这就有了速度上的优势。 因为如果你在调用一个没有引用对象字段的方法时,真的没有必要检查指针。 事实上,这样的方法等同于一个静态方法。一个对象可能根本没有数据,但它可以实现绝对不同的、至关重要的行为,例如,以一种特殊类型的方式引用一些外部数据,或者根本执行一个特殊的动作。我不知道如何证明 "在没有数据的情况下,方法等同于静态(即100%不是虚拟)方法 "这种做法是合理的。 也就是说,至少一个指针对象总是有一个字段--那就是它的类型。通过它,你可以确定被调用方法的地址。否则你为什么需要OOP呢? P.S. 虽然对于自动对象,我个人并不反对至少有一些行为逻辑(因为我几乎不使用它们),但是你不应该让它们被分配给指针 Ilyas 2018.12.24 15:17 #23573 不幸的是,我误导了大家,因为建筑 B *b=a; B b=a; 拷贝操作符被调用,而不是拷贝构造器。 在第二种情况下,在B()构造函数被调用后 无论如何,我们会先分析,然后再纠正。 pavlick_ 2018.12.24 15:26 #23574 哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。 class Q { public: Q(Q&)=default; // нельзя Q(int) {} // из-за него копирующий конструктор исчез }; Ilyas 2018.12.24 15:29 #23575 pavlick_:哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。 不支持默认和删除。默认的复制构造函数,事实证明,到目前为止已经完成了。 只有复制操作者,即为结构体。 CFoo foo=another_foo; 首先调用默认的CFoo构造函数,然后是复制操作符 Alexey Navoykov 2018.12.24 15:30 #23576 Ilyas:的时候,会调用复制操作符,而不是复制构造器。 但这仍然是一个错误,因为隐式复制操作符只应该为类B创建,而不是为所有父类创建。也就是说,不应该允许对象部分替换其内部结构。 pavlick_ 2018.12.24 15:31 #23577 Ilyas:不支持默认和删除这是正确的,但你只需要在有一个自定义的复制 构造函数时覆盖复制构造函数的生成,不是吗?不是任何定制的。 A100 2018.12.24 15:42 #23578 Alexey Navoykov: 也就是说,不应允许该物体部分取代其内脏。这是某种人为的自我限制......。我甚至会说心胸狭窄。 class A {}; class B : public A { public: void operator =( const A& ) {} }; 问题是什么? 我在自己身上发现了这样的设计...它的作用...很好。所以我建议开发商保持现状......至少在相应的运算符/结构体被明确定义的情况下是如此 Alexey Navoykov 2018.12.24 15:53 #23579 A100:这是某种人为的自我限制......。我甚至会说心胸狭窄。 有什么问题呢? 在我的地方发现了这样的构造...一切都很顺利...很好。所以我建议开发商保持现状......至少在相关运算符被明确定义的情况下先看看在C++中是如何工作的。显然,它的规则是由 "心胸狭窄 "的人发明的。 并创建插头,以保护自己免受每次不正确的语言架构的影响......不,你必须从一开始就这样做,我是说语言 A100 2018.12.24 16:05 #23580 Alexey Navoykov:先看看事情在C++中是如何运作的。显然,其规则是由 "心胸狭窄 "的人发明的。 但是,为了保护自己不受错误的语言架构的影响,每次都要做塞子...不,你必须从一开始就做到这一点。 我是说语言。考虑到https://www.mql5.com/ru/forum/1111/page2358#comment_10003995,特别为你重新检查了它。 #ifdef __cplusplus #include "https://www.mql5.com/ru/forum/1111/page2358#comment_10003995" void OnStart() { A a; B b; b = a; } #endif 没关系的DJ Ошибки, баги, вопросы 2018.12.24www.mql5.com Общее обсуждение: Ошибки, баги, вопросы 1...235123522353235423552356235723582359236023612362236323642365...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
尽管即使该对象没有虚拟方法,你在访问它的时候仍然应该检查指针的有效性。
事实上,这是一个模棱两可的问题。例如,这个检查在C#中始终存在,而在C++中只有在需要时才会出现,这在速度上有优势。
毕竟,如果你调用一个不访问对象字段的方法,那么检查指针就真的没有意义了。 从本质上讲,这样的方法相当于一个静态的方法。
一般来说,这是一个模棱两可的问题。例如,C#总是有这样的检查,而C++只有在需要时才有,这就有了速度上的优势。
因为如果你在调用一个没有引用对象字段的方法时,真的没有必要检查指针。 事实上,这样的方法等同于一个静态方法。
一个对象可能根本没有数据,但它可以实现绝对不同的、至关重要的行为,例如,以一种特殊类型的方式引用一些外部数据,或者根本执行一个特殊的动作。我不知道如何证明 "在没有数据的情况下,方法等同于静态(即100%不是虚拟)方法 "这种做法是合理的。
也就是说,至少一个指针对象总是有一个字段--那就是它的类型。通过它,你可以确定被调用方法的地址。否则你为什么需要OOP呢?
P.S. 虽然对于自动对象,我个人并不反对至少有一些行为逻辑(因为我几乎不使用它们),但是你不应该让它们被分配给指针不幸的是,我误导了大家,因为建筑
拷贝操作符被调用,而不是拷贝构造器。
在第二种情况下,在B()构造函数被调用后
无论如何,我们会先分析,然后再纠正。
哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。
哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。
不支持默认和删除。
默认的复制构造函数,事实证明,到目前为止已经完成了。
只有复制操作者,即为结构体。
首先调用默认的CFoo构造函数,然后是复制操作符
的时候,会调用复制操作符,而不是复制构造器。
不支持默认和删除
这是正确的,但你只需要在有一个自定义的复制 构造函数时覆盖复制构造函数的生成,不是吗?不是任何定制的。
也就是说,不应允许该物体部分取代其内脏。
这是某种人为的自我限制......。我甚至会说心胸狭窄。
问题是什么?
我在自己身上发现了这样的设计...它的作用...很好。所以我建议开发商保持现状......至少在相应的运算符/结构体被明确定义的情况下是如此
这是某种人为的自我限制......。我甚至会说心胸狭窄。
有什么问题呢?
在我的地方发现了这样的构造...一切都很顺利...很好。所以我建议开发商保持现状......至少在相关运算符被明确定义的情况下
先看看在C++中是如何工作的。显然,它的规则是由 "心胸狭窄 "的人发明的。
并创建插头,以保护自己免受每次不正确的语言架构的影响......不,你必须从一开始就这样做,我是说语言
先看看事情在C++中是如何运作的。显然,其规则是由 "心胸狭窄 "的人发明的。
但是,为了保护自己不受错误的语言架构的影响,每次都要做塞子...不,你必须从一开始就做到这一点。 我是说语言。
考虑到https://www.mql5.com/ru/forum/1111/page2358#comment_10003995,特别为你重新检查了它。
没关系的DJ