MQL5 编译器不区分类和它的指针 - 页 2

 
SemenTalonov:

这就是我所期待的副本...默认的复制构造函数不是一个错误。

但是Dmitry 说,一个新的对象将被分配到内存中,并且将返回一个POINTER_AUTOMATIC 类型的指针

每个人都以他自己的方式理解MQL的怪癖)

是的,事实证明没有圣诞父亲。

我还没有写到记忆中的任何对象。

好吧,曾经有关于如何区分引用和指针的争议。但现在看来,我们无法区分对象和指针。

 
Dmitry Fedoseev:

一个物体的副本从何而来?指针的拷贝,是的,但指向同一个对象。

我们有一个对象的数组。在这个数组的第一个元素上调用一个赋值运算符,这个运算符被传递给单独创建的对象(尽管,这个运算符是未声明的)。你认为之后数组的第一个元素应该是什么?在我看来,这个对象应该保留。

 
SemenTalonov:

我的观点是,一个明确声明的复制构造函数在这个测试中不会改变任何东西。

你怎么能看不到明显的...

一个 对象数组项 包含一个指针,指针数组项中有一个对象......这真的正常吗?

在第一种情况下,一个对象指针进入数组在第二种情况下,复制构造函数应该起作用,这些操作怎么可能是等同的?

不是复制构造函数,而是赋值运算符,但这是小事。

它是应该进入对象数组的一个元素的对象。

在第一种情况下--你正好有一个对象阵列,什么样的 "指针"?

 
Georgiy Merts:

我们有一个对象的数组。赋值运算符 在这个数组的第一个元素处被调用,单独创建的对象被传递给它。你认为这个数组之后的第一项应该是什么?在我看来,这个对象应该保留。

А...那里一点都不好)))。自动指针的数组,并且在其中还塞入了动态创建的对象。然后有3个对象,其中两个将被自动删除,一个将泄漏。如果它被编译了。

 

它应该是这样的。

A* m_A[2];

和这样。

m_A[0] =GetPointer(a); 
 

最后,它是这样的。

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А...那里一点都不好)))。一个自动指针的数组,他们还塞进了一个动态创建的对象。

最后!))。

格奥尔基-梅尔茨

这是必须放在 对象数组元素中的对象。

在第一种情况下--你正好有一个对象的数组,什么 "指针"?

这就是我的观点 !为什么它能工作?

m_A[1] = new A();
 
SemenTalonov:

最后!))。

这就是我的观点!为什么它能工作?

如果A被宣布为如此。

A* m_A[2]; 

那么就可以了。

如果是这样的话。

A m_A[2]; 

它不应该被编译。要么是编译器有问题,要么是编译器不需要为大家考虑。

 
这可能不是一个错误,但分配简单的对象应该是有效的,所以你必须注意删除你用new创建的对象。
 
Dmitry Fedoseev:

那么它就不应该被编译。要么是编译器有问题,要么是编译器不需要为大家考虑。

中奖了!

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC 类型的指针保存为一个POINTER_DYNAMIC 类型 的指针,反之亦然。