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

 
Alexey Navoykov:
¿Así que propones que se prohíba por completo el nombramiento implícito de los punteros? No creo que mucha gente aquí esté contenta con eso.

Que todo el mundo pueda elegir.

#property strict

Desde luego, no quiero ese tipo de trucos.

 
SemenTalonov:

Bueno, eso no hace falta decirlo. Hay una fuga de memoria.

¿Una fuga de memoria, dices? ¿Qué te parece esto? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

¿Una fuga de memoria, dices? ¿Qué te parece esto? )))


delete item;

Por lo tanto, supone que el sujeto está preparado para ser tratado de esa manera. ¿Cuántos prevén esta posibilidad?

 
SemenTalonov:

Esto supone que el objeto está preparado para ser tratado de esta manera. ¿Prevé mucha gente esa posibilidad?

Creo que si alguien escribe la palabra new, debería saber exactamente dónde se encuentra la correspondiente palabra delete en otra parte de su código.

 
Esta construcción, por cierto, si es un poco refinada, se llama "recolector de basura"))
 
SemenTalonov:

Que todo el mundo pueda elegir.

Desde luego, no necesito esos trucos.

Ya lo uso en MQL4. ¿Cómo va a funcionar entonces, si la sintaxis del lenguaje es la misma?

Pues bien, como protección contra estas acciones se puede crear un método privado en una clase:

class A
{
 private: void operator=(const A*);
}

Aunque, sinceramente, no veo el problema aquí. Si asignas algo a un objeto de clase, a priori esperas que se llame al operador de copia. Si lo quieres, lo consigues. ¿Qué diferencia hay si se trata de un puntero o de un objeto? El tipo de clase es el mismo. No se puede asignar ninguna clase a la izquierda. Por eso, todo parece más bien un aburrimiento.

El caso opuesto, con el puntero a la izquierda, es otra cosa. Allí se podría haber esperado asignar algo al puntero, pero resultó ser la copia de un objeto.

 
Alexey Navoykov:

El caso opuesto, con el pun tero a la izquierda, es diferente. Ahí podrías esperar asignar algo al puntero, pero resulta que estás copiando un objeto.

Y no puedes prohibirlo, de lo contrario no podrás copiar el objeto cuando realmente lo necesites.

Como resultado, hay que dejar todo como está. Sólo hay que ser consciente de lo que se hace.

 
fxsaber:

Y no puedes prohibirlo, de lo contrario no podrás copiar el objeto cuando realmente lo necesites.

Al final, hay que dejarlo como está. Sólo sé consciente de lo que estás haciendo.

¡О! Eso es lo principal.

¿Hay mucha gente aquí que sepa navegar por los modos de gestión de la memoria? Entender la diferencia entre AUTOMÁTICO y DINÁMICO.

Y han escuchado algo sobre STATIC y BASED (aunque no es necesario).

 
fxsaber:

Y no puedes prohibirlo, de lo contrario no podrás copiar el objeto cuando realmente lo necesites.

Al final, hay que dejarlo como está. Sólo hay que ser consciente de lo que se hace.

¿Por qué no puede funcionar? Hay operadores * y & para convertir a lo que necesitas.
 
Alexey Navoykov:
¿Por qué no puede funcionar? Hay operadores * y & para reducirlo a lo necesario.

¿Dónde hay un *?

Razón de la queja: