Preguntas sobre POO en MQL5 - página 86

 
Igor Makanu:

eso tiene sentido

pero sospecho que el objetivo es usarlo con métodos estáticos

Necesito probarlo, pero no sé cómo, así que pregunté


UPD: ayer busqué en Google este tema, muchas menciones al destructor privado, también hay que pensar qué puede hacer

Los métodos estáticos no tienen un puntero this, y no pueden hacer nada por ese puntero.

El destructor privado garantiza que el objeto será eliminado por el propio objeto. Pero como dije arriba, no es una buena práctica a evitar en mi opinión (aunque, a veces es bastante útil, y en VARIOS casos es aceptable usarla).

 
Georgiy Merts:

Los métodos estáticos no tienen un puntero this y no pueden hacer nada con este puntero.

Puede que haya entendido mal tu mensaje, pero soy consciente de que el método no tiene un puntero a este , solo lo tiene la propia instancia del objeto , lo escribí porque desde el método estático los campos de la clase están disponibles y lo más probable es que se puedan manipular con el borrado

el objetivo es mirar este diseño, nunca lo he probado, y no es una forma común


Sergey Dzyublik:

1) Desde los métodos estáticos se prohíbe su acceso.
Dónde está "delete &this;" - https://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this

2) El destructor privado prohíbe la creación de un objeto en la pila, pero todavía se puede crear a través del operador new, esta vez en el montón:

Aquí hay otro uso de borrar &esto.

gracias, lo comprobaré, es útil




ocupado, todo en reparación, preguntaré más tarde... sólo de memoria, ¿qué sucede si una clase base tiene un método con

delete &this;

y desde una clase derivada llamar a un método con la clase base eliminada.... ningún propósito práctico, pero por ahora quiero descubrirlo

 
Igor Makanu:

Puede que haya entendido mal tu mensaje, pero soy consciente de que el método no tiene un puntero this, sólo lo tiene la instancia del propio objeto, lo escribí porque los campos de la clase están disponibles desde el método estático, y lo más probable es que se pueda manipular con el borrado

hasta ahora el propósito de mirar este diseño, nunca lo he probado y no es una forma común


Gracias, lo comprobaré, es útil.




Ocupado, todo en reparaciones, preguntaré más tarde... sólo de memoria, ¿qué sucede si una clase base tiene un método con

y desde una clase derivada llamar a un método con la clase base removida.... ningún propósito práctico, pero por ahora quiero descubrirlo

No te molestes, nunca lo necesitarás.

Hay que entender los fundamentos de la lengua antes de ocuparse de estas cosas.

 
Koldun Zloy:

No te molestes, nunca lo necesitarás.

Esa afirmación no es correcta, si no amplías tus horizontes, por supuesto que no lo necesitarás.

Koldun Zloy:

Hay que entender los fundamentos de la lengua antes de abordar este tipo de cosas.

Lo hago como puedo, pero en general resuelvo el 90%+% de los problemas de MQL sobre la marcha, los problemas suelen ser típicos y la mayoría ya han sido resueltos y son de libre acceso.



en relación con la eliminación de &this; ... ... Utilicé una orden de clase que monitorizaba su apertura y a requotes era capaz de reabrir la orden ... ... y muchas otras cosas,

he creado y eliminado este objeto (clase de orden) de otra clase, puede que me resulte más cómodo utilizardelete &this;...

 

Me pregunto si esto es un fallo o una característica)

Hay una estructura dentro de la instancia de la clase.

Pongo un punto para ver el contenido de la estructura.
Pero sólo se muestra si pongo corchetes.
Aunque la estructura está en una sola instancia.

el problema se resuelve si la clase no es un elemento de la matriz.




y el propio código para "curiosear"

class ABC
{   
   public:         
           struct ST
           {    
              int r;
              int U;
                  ST() {r=0; U=0;}           
           };
           ST st;
};
ABC abc[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

abc[0].st.r;

   return(INIT_SUCCEEDED);
  }
 
Pavel Verveyko:

Me pregunto si esto es un fallo o una característica)

Hay una estructura dentro de la instancia de la clase.

Pongo un punto para ver el contenido de la estructura.
Pero sólo se muestra si pongo corchetes.
Aunque la estructura está en una sola instancia.

el problema se resuelve si la clase no es un elemento de la matriz.




y el propio código para "curiosear"

esto podría ser correcto :-)

 
Maxim Kuznetsov:

probablemente sea así :-)

tal vez) pero no cambia el punto sobre la información de la herramienta)

 
Pavel Verveyko:

Me pregunto si esto es un fallo o una característica)

Hay una estructura dentro de la instancia de la clase.

Pongo un punto para ver el contenido de la estructura.
Pero sólo se muestra si pongo corchetes.
Aunque la estructura está en una sola instancia.

el problema se resuelve si la clase no es un elemento de la matriz.




y el propio código para "pinchar"

Otro error del editor(
 

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html

Везде, где это возможно, заменяйте глобальные переменные локальными.

Se necesitan más comandos para acceder a las variables globales que para acceder a las variables locales. Además, a menos que se indique explícitamente lo contrario, el compilador asume que la subrutina llamada puede cambiar los valores de todas las variables globales. Así, después de llamar a la subrutina, los valores de todas las variables globales se cargan en la memoria repetidamente, lo que reduce el rendimiento.


Si necesitas acceder a una variable global (que no es compartida por este hilo y otros), copia su valor en una variable local y trabaja con la copia.

El uso de una copia local proporciona una ganancia de rendimiento, excepto cuando se accede a la variable global una sola vez.


Si en mi ejemplo:

class CEA
{
private:
   double            _Ask, _Bid;
public:
   void              onTick(const MqlTick &tick);
};
//+------------------------------------------------------------------+
void CEA::onTick(const MqlTick &tick)
{
   _Ask = tick.ask;
   _Bid = tick.bid;
}

en el método onTick() copiar los valores de ask y bid y utilizar _Ask, _Bid (comercio virtual) en el resto de los métodos

¿será como trabajar con variables globales?

ZS: como opción, por supuesto que puedo pasar por referencia &tick en todos los métodos, pero de nuevo, preguntas, lo que es más eficaz

 
Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


si en mi ejemplo:

copiar los valores de asc y bid en el método onTick() y utilizar _Ask, _Bid (comercio virtual) en el resto de los métodos

¿será como trabajar con variables globales?

ZS: como opción, puedo por supuesto pasar por referencia &tick a todos los métodos, pero de nuevo, pregunta qué es más efectivo

Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


Si en mi ejemplo:

en el método onTick() copiar los valores de asc y bid y utilizar _Ask, _Bid (comercio virtual) en otros métodos

¿será como trabajar con variables globales?

ZS: como opción, por supuesto que puedo pasar por referencia &tick en todos los métodos, pero de nuevo, preguntas, lo que es más eficaz

Pregunta. ¿Qué sentido tiene la cabra? Si en un método, una clase, en un caballo esférico, sí en un vacío físico (bueno estoy borracho)))), entonces sí, tiene sentido. Y si en un proyecto real, o bien una clase a nivel global, o bien una sola que maneje todo este trichomudin (perdón por el extra de bourbon))))) al principio del manejador, y, solicitar directamente de él en cualquier lugar))
Razón de la queja: