Domande su OOP in MQL5 - pagina 7

 
Dmitry Fedoseev:

Se il numero di oggetti è noto in anticipo ed è costante durante l'esecuzione del programma, allora il nuovo non è necessario. In tutti gli altri casi, avete bisogno di nuovo.

No, ecco il mio esempiohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

è conveniente passare parametri al costruttore e se l'utente cambia le impostazioni, è più veloce uccidere la classe in OnDeinit() e poi crearla con i nuovi parametri in OnInit()

;)

 
Igor Makanu:

no, ecco il mio esempiohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

è conveniente passare parametri al costruttore e se l'utente cambia le impostazioni, è più veloce uccidere la classe in OnDeinit() e poi crearla con i nuovi parametri in OnInit()

;)

I parametri possono anche essere passati al costruttore senza new.

 
Dmitry Fedoseev:

I parametri possono essere passati al costruttore senza new.

Quindi, come cambierete i campi di classe (le impostazioni EA modificate dall'utente)? - Scriverai un altro metodo? Credevo che nell'ultima pagina vi stavate battendo per"una variabile in piùper un puntatore". "e qui c'è tutto un metodo!

;)

 
Igor Makanu:

e? e come cambierete i campi di classe (le impostazioni EA modificate dall'utente)? - Scriverai un altro metodo? Pensavo che nell'ultima pagina vi stavate battendo per"una variabile in piùper il puntatore"."con cui stavi lottando, ed ecco un intero metodo!

;)

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

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

CX cx(a1,a2);
 
Dmitry Fedoseev:

no way ;)

#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);
  }
//+------------------------------------------------------------------+

cambiare le impostazioni EA

 
Igor Makanu:

no way ;)

cambiare le impostazioni EA

Bella imboscata.

Tuttavia, preferirei aggiungere un metodo per cambiare i parametri, ma non usare new solo per i parametri.
 
Dmitry Fedoseev:

Bella imboscata.

Tuttavia, preferisco aggiungere un metodo per cambiare i parametri, ma non usare new solo per i parametri.

non usare il nuovo è una superstizione? )))

imho, se è conveniente, bisogna usarlo! - Il tuo esempio sarà riscritto in 2 clic usando new e tutto funzionerà correttamente e gestirà la situazione quando l'utente cambia le impostazioni

#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:

non usare il nuovo è superstizione? )))

imho, se è conveniente, bisogna usarlo! - Il tuo esempio si riscrive in 2 clic usando new e tutto funziona correttamente e gestisce la situazione quando l'utente cambia le impostazioni

Non superstizione, solo pigrizia, storicamente, dovuta alle circostanze. Dovete scrivere cancellazione e farlo in Deinit(). Ma la funzione Deinit() non era presente nel template di default. Ora guardo - il modello EA ha Deinit(), ma prima non c'era.

 
Dmitry Fedoseev:

Non superstizione, solo pigrizia, storicamente, dovuta alle circostanze. Dovremmo scrivere cancellare e farlo in Deinit(). Ma la funzione Deinit() non era presente nel template di default. Sto cercando ora - c'è Deinit() nel modello EA, ma prima non c'era.

Non scrivere cancellare - tutto funzionerà correttamente, questo peccato (voglio dire superstizione) ) ) prenderà il controllo del terminale e borbotterà nel log "48 byte di memoria persa", "2 oggetti di tipo CX rimasti" e "oggetti non cancellati rimasti".

HH: nel template dell'indicatore non c'è Deinit() - questo è fastidioso

 
Igor Makanu:

non scrivere cancellare - tutto funzionerà correttamente, questo peccato (voglio dire superstizione)) ) prenderà il controllo del terminale e borbotterà nel suo log "48 byte di memoria persa", poi "2 oggetti di tipo CX rimasti" e "oggetti non cancellati rimasti"

SZY: in un modello di creazione dell'indicatore non c'è Deinit() - si sforza

Funzionerà senza cancellare, ma è inutile. Ma il terminale si occupa di questo problema? Segnala solo le perdite di memoria, ma non dedica gli stessi oggetti.

Motivazione: