Preguntas sobre POO en MQL5 - página 7

 
Dmitry Fedoseev:

Si el número de objetos se conoce de antemano y es constante durante la ejecución del programa, entonces no se necesita new. En todos los demás casos, se necesita nuevo.

No, este es mi ejemplohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

es conveniente pasar parámetros al constructor y si el usuario cambia la configuración, es más rápido matar la clase en OnDeinit() y luego crearla con los nuevos parámetros en OnInit()

;)

 
Igor Makanu:

no, aquí está mi ejemplohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

es conveniente pasar parámetros al constructor y si el usuario cambia la configuración, es más rápido matar la clase en OnDeinit() y luego crearla con los nuevos parámetros en OnInit()

;)

Los parámetros también se pueden pasar al constructor sin new.

 
Dmitry Fedoseev:

Los parámetros se pueden pasar al constructor sin new.

Entonces, ¿cómo va a cambiar los campos de clase (el usuario cambió la configuración de EA)? - ¿Escribirás un método más? Pensé que en la última página estabas luchando por"una variable máspara un puntero"."¡y aquí tienes todo un método!

;)

 
Igor Makanu:

y... ¿cómo va a cambiar los campos de la clase (ajustes de EA modificados por el usuario)? - ¿Escribirás otro método? Pensé que en la última página estabas luchando por"una variable más para el puntero"." con el que estabas luchando, ¡y aquí tienes todo un método!

;)

input int a1=1;
input int a2=2;

class CX{
   public:
   void CX(int a,int b){
   
   }
};

CX cx(a1,a2);
 
Dmitry Fedoseev:

de ninguna manera ;)

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX cx(a1,a2);  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+

cambiar la configuración del EA

 
Igor Makanu:

de ninguna manera ;)

cambiar la configuración de EA

Buena emboscada.

Sin embargo, preferiría añadir un método para cambiar los parámetros, pero no usar new sólo por los parámetros.
 
Dmitry Fedoseev:

Buena emboscada.

Sin embargo, prefiero añadir un método para cambiar los parámetros, pero no usar new sólo por los parámetros.

¿no usar lo nuevo es una superstición? )))

¡imho, si es conveniente, hay que usarlo! - Su ejemplo será reescrito en 2 clics usando new y todo funcionará correctamente y manejará la situación cuando el usuario cambie la configuración

#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX *cx;
//+------------------------------------------------------------------+
int OnInit()
  {
   cx = new CX(a1,a2);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  delete cx;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

¿no usar lo nuevo es superstición? )))

¡imho, si es conveniente, hay que usarlo! - Tu ejemplo se reescribirá en 2 clics usando new y todo funcionará correctamente y manejará la situación cuando el usuario cambie la configuración

No es superstición, sólo pereza, históricamente, debido a las circunstancias. Tienes que escribir delete y hacerlo en Deinit(). Pero la función Deinit() no estaba presente en la plantilla por defecto. Ahora miro - la plantilla de EA tiene Deinit(), pero no estaba allí antes.

 
Dmitry Fedoseev:

No es superstición, sólo pereza, históricamente, debido a las circunstancias. Deberíamos escribir delete, y hacerlo en Deinit(). Pero la función Deinit() no estaba presente en la plantilla por defecto. Estoy mirando ahora - hay Deinit() en la plantilla de EA, pero no estaba allí antes.

No escriba borrar - todo funcionará correctamente, este pecado (me refiero a la superstición) ) ) se apoderará del terminal y murmurará en el registro "48 bytes de memoria filtrada", "quedan 2 objetos de tipo CX" y "quedan objetos sin borrar".

HH: en la plantilla del indicador no hay Deinit() - esto es molesto

 
Igor Makanu:

no escriba borrar - todo funcionará correctamente, este pecado (me refiero a la superstición)) ) tomará el control del terminal y murmurará en su registro "48 bytes de memoria filtrada", luego "quedan 2 objetos de tipo CX" y "quedan objetos sin borrar"

SZY: en un modelo de creación del indicador no hay Deinit() - se cuela

Funcionará sin borrar, pero es inútil. Pero, ¿se ocupa el terminal de este problema? Sólo informa de las fugas de memoria, pero no dedica los mismos objetos.