MQL5 El compilador no distingue entre una clase y un puntero a ella - página 2

 
SemenTalonov:

Eso es lo que esperaba de la copia... El constructor de copia por defecto no es un error.

PeroDmitry dice que se asignará un nuevo objeto en memoria y se devolverá un puntero de tipoPOINTER_AUTOMATIC.

Cada uno entiende las peculiaridades de MQL a su manera)

Sí. Resulta que no existe Papá Noel.

No he escrito sobre ningún objeto en la memoria.

De acuerdo, una vez hubo disputas sobre cómo distinguir una referencia de un puntero. Pero ahora parece que no podemos distinguir un objeto de un puntero.

 
Dmitry Fedoseev:

¿De dónde sale una copia de un objeto? Una copia de un puntero, sí, pero apuntando al mismo objeto.

Tenemos una matriz de objetos. Se llama a un operador de asignación en el primer elemento de este array, al que se le pasa el objeto creado por separado (aunque, el operador no está declarado). ¿Qué crees que debería haber en el primer elemento de la matriz después de eso? En mi opinión, el objeto debe permanecer.

 
SemenTalonov:

Mi punto es que un constructor de copia declarado explícitamente no cambiaría nada en esta prueba.

¿Cómo puedes no ver lo obvio...

Un elemento del array de objetos contiene un puntero y un objeto en el elemento del array de punteros... ¿es realmente normal?

En el primer caso, un puntero de objeto va a la matriz en el segundo caso, el constructor de copia debería funcionar, ¿cómo pueden ser equivalentes estas operaciones?

No el constructor de copia, sino el operador de asignación, pero eso son las pequeñas cosas.

Es el objeto que debe ir en un elemento de un array de objetos.

En el primer caso - tienes exactamente un array de objetos, ¿qué tipo de "punteros"?

 
Georgiy Merts:

Tenemos un array de objetos. Se llama al operador de asignación en el primer elemento de este array y se le pasa el objeto creado por separado. ¿Qué crees que debería haber en el primer elemento de esta matriz después de eso? En mi opinión, el objeto debe permanecer.

А... No es bueno allí en absoluto))) Array de punteros automáticos, y en él también se encajan los objetos creados dinámicamente. Entonces hay 3 objetos, dos de ellos se borrarán automáticamente y uno se filtrará. Si se compila.

 

Debería ser así:

A* m_A[2];

y así:

m_A[0] =GetPointer(a); 
 

Y al final es así:

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

А... No es bueno allí en absoluto))) Un array de punteros automáticos, y también meten un objeto creado dinámicamente.

Por fin))

Georgiy Merts:

Es el objeto que debe colocarse en el elemento de la matriz de objetos.

En el primer caso - tienes exactamente un array de objetos, ¿qué "punteros"?

¡Ese es mi punto! ¿Por qué funciona?

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

Por fin))

¡Ese es mi punto! ¿Por qué funciona?

Si A se declara así:

A* m_A[2]; 

Entonces está bien.

Y si se declara así:

A m_A[2]; 

No debería compilar. O hay un error en el compilador, o el compilador no tiene que pensar por todos.

 
Probablemente no sea un error, pero la asignación de objetos simples debería funcionar, por lo que hay que tener cuidado de borrar el objeto que se creó con new.
 
Dmitry Fedoseev:

Entonces no debería compilar. O hay un error en el compilador, o el compilador no tiene que pensar por todos.

¡Bingo!

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC en un puntero de tipoPOINTER_DYNAMIC y viceversa.
Razón de la queja: