错误、漏洞、问题 - 页 2358

 
Ilya Malev:

尽管即使该对象没有虚拟方法,你在访问它的时候仍然应该检查指针的有效性。

事实上,这是一个模棱两可的问题。例如,这个检查在C#中始终存在,而在C++中只有在需要时才会出现,这在速度上有优势。

毕竟,如果你调用一个不访问对象字段的方法,那么检查指针就真的没有意义了。 从本质上讲,这样的方法相当于一个静态的方法。

 
Alexey Navoykov:

一般来说,这是一个模棱两可的问题。例如,C#总是有这样的检查,而C++只有在需要时才有,这就有了速度上的优势。

因为如果你在调用一个没有引用对象字段的方法时,真的没有必要检查指针。 事实上,这样的方法等同于一个静态方法。

一个对象可能根本没有数据,但它可以实现绝对不同的、至关重要的行为,例如,以一种特殊类型的方式引用一些外部数据,或者根本执行一个特殊的动作。我不知道如何证明 "在没有数据的情况下,方法等同于静态(即100%不是虚拟)方法 "这种做法是合理的。

也就是说,至少一个指针对象总是有一个字段--那就是它的类型。通过它,你可以确定被调用方法的地址。否则你为什么需要OOP呢?

P.S. 虽然对于自动对象,我个人并不反对至少有一些行为逻辑(因为我几乎不使用它们),但是你不应该让它们被分配给指针
 

不幸的是,我误导了大家,因为建筑

B *b=a;
B b=a;

拷贝操作符被调用,而不是拷贝构造器。
在第二种情况下,在B()构造函数被调用后

无论如何,我们会先分析,然后再纠正。

 

哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。

class Q
{
public:
   Q(Q&)=default;  // нельзя
   Q(int) {}       // из-за него копирующий конструктор исчез
};
 
pavlick_:

哦,原来µl有一个自动生成的复制构造函数(我以为它根本不存在,因为你不能把obj(other_obj)类化,只能用=)。但为什么不产生,如果。

不支持默认和删除。

默认的复制构造函数,事实证明,到目前为止已经完成了。

只有复制操作者,即为结构体。

CFoo foo=another_foo;

首先调用默认的CFoo构造函数,然后是复制操作符

 
Ilyas:

的时候,会调用复制操作符,而不是复制构造器。

但这仍然是一个错误,因为隐式复制操作符只应该为类B创建,而不是为所有父类创建。也就是说,不应该允许对象部分替换其内部结构。
 
Ilyas:

不支持默认和删除

这是正确的,但你只需要在有一个自定义的复制 构造函数时覆盖复制构造函数的生成,不是吗?不是任何定制的。

 
Alexey Navoykov:
也就是说,不应允许该物体部分取代其内脏。

这是某种人为的自我限制......。我甚至会说心胸狭窄。

class A {};
class B : public A {
public:
        void operator =( const A& ) {}
};

问题是什么?

我在自己身上发现了这样的设计...它的作用...很好。所以我建议开发商保持现状......至少在相应的运算符/结构体被明确定义的情况下是如此

 
A100:

这是某种人为的自我限制......。我甚至会说心胸狭窄。

有什么问题呢?

在我的地方发现了这样的构造...一切都很顺利...很好。所以我建议开发商保持现状......至少在相关运算符被明确定义的情况下

先看看在C++中是如何工作的。显然,它的规则是由 "心胸狭窄 "的人发明的。

并创建插头,以保护自己免受每次不正确的语言架构的影响......不,你必须从一开始就这样做,我是说语言

 
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.24
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы