Domande su OOP in MQL5 - pagina 19

 
Vladimir Simakov:
Ho un presupposto che non ci sarà un lotto, per esempio 0,15. Almeno io non ne ho sentito parlare. Se lo farò, lo cambierò.

So che è improbabile, ma si vuole sempre la soluzione perfetta ))))

Ok, non è il problema più grande, ma mi sono creato un problema... Volevo un OOP perfetto, ma senza chiamate inutili e tutto era ottimale

Voglio avere 5 istanze della classe, ma ho bisogno di inizializzare i campi della classe una volta - contengono ambiente terminale, che non cambierà durante l'esecuzione del programma.

string         Language;

Se dichiaro static string Language; - allora ci sarà un errore unresolved static variable 'A::Language'

Ecco un esempio

//+------------------------------------------------------------------+
class A
  {
public:
   string         Language;
                     A() { Print(__FUNCTION__); Language = TerminalInfoString(TERMINAL_LANGUAGE); }

  };
//+------------------------------------------------------------------+
class B:public A
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

Inizializzerò la stringa Language 5 volte in questo modulo - è sbagliato e non compilerà con i modificatori statici

e non c'è bisogno di avere 5 copie della variabile Lingua! - provato nella classe B a dichiarare un'istanza della classe - stessa cosa 5 Le variabili di lingua hanno

2019.08.29 12:44:58.384 tst__ EURUSD,M15: inizializzato

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

 
Igor Makanu:

So che è improbabile, ma si vuole sempre la soluzione perfetta ))))

Ok, non è il problema più grande, ma mi sono creato un problema... Volevo un OOP perfetto, ma senza chiamate inutili e tutto era ottimale

Voglio avere 5 istanze della classe, ma ho bisogno di inizializzare i campi della classe una volta - contengono ambiente terminale, che non cambierà durante l'esecuzione del programma.

Se dichiaro static string Language; - allora ci sarà un errore unresolved static variable 'A::Language'

Ecco un esempio

Inizializzerò la stringa Language 5 volte in questo modulo - non è corretto, e non compila con i modificatori statici

2019.08.29 12:44:58.384 tst__ EURUSD,M15: inizializzato

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

class Test
  {
private:
   static const string Language;
public:
                     Test(void){}
                    ~Test(void){}
  };
static const string Test::Language=::TerminalInfoString(TERMINAL_LANGUAGE);
 
Andrey Barinov:

OK, questa è un'opzione

Ma voglio avvolgere tutto in una classe - nel mio esempio ho la classe B e voglio 5 istanze di B, ma non voglio inizializzareLanguage 5 voltee quindi non voglio avere una variabileLanguage in ogni istanza

Come faccio a sbarazzarmi dellalingua extra?

 
Igor Makanu:

OK, questa è un'opzione

Ma voglio avvolgere tutto in una classe - nel mio esempio ho la classe B e voglio 5 istanze di B, ma non voglio inizializzare Language 5 volte e quindi non voglio avere una variabileLanguage in ogni istanza

Come posso sbarazzarmi dellalingua extra?

Ereditare. In questo modo sarà inizializzato solo una volta.

 
Igor Makanu:

So che è improbabile, ma si vuole sempre la soluzione perfetta ))))

Ok, non è il problema più grande, ma mi sono creato un problema... Volevo un OOP perfetto, ma senza chiamate inutili e tutto era ottimale

Voglio avere 5 istanze della classe, ma ho bisogno di inizializzare i campi della classe una volta - contengono ambiente terminale, che non cambierà durante l'esecuzione del programma.

Se dichiaro static string Language; - allora ci sarà un errore unresolved static variable 'A::Language'

Ecco un esempio

Inizializzerò la stringa Language 5 volte in questo modulo - è sbagliato e non compilerà con i modificatori statici

e non c'è bisogno di avere 5 copie della variabile Lingua! - provato nella classe B a dichiarare un'istanza della classe - stessa cosa 5 Le variabili di lingua hanno

2019.08.29 12:44:58.384 tst__ EURUSD,M15: inizializzato

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

Sono al telefono in questo momento. Ricordamelo stasera e ti mostrerò come risolverlo.
 
Andrey Barinov:

Ereditare. In questa forma, sarà inizializzato solo una volta.

Funziona per me

//+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print(__FUNCTION__);
   return("ru");
  }
//+------------------------------------------------------------------+
class CLang
  {
protected:
   static const string Language;
public:
                     CLang(void) {Print(__FUNCTION__);}
                    ~CLang(void) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B:public CLang
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: inizializzato

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


almeno myTerminalInfoString() è chiamato una volta


Quindi ho una specie di Singleton

Grazie!

 
Vladimir Simakov:
Sono al telefono in questo momento. Ricordamelo in serata e ti mostrerò come risolverlo.

Ok, se non è troppo disturbo.

e il tema Singleton è abbastanza nuovo per me, c'è spazio per la creatività - esempi

 
Igor Makanu:

Ok, se non è troppo disturbo.

e il tema Singleton è abbastanza nuovo per me, c'è spazio per la creatività - esempi

Quindi volete un singleton o un campo generale per gli oggetti?
 
Vladimir Simakov:
Quindi, ne avete bisogno o volete un campo comune per gli oggetti?

è difficile dire cosa voglio ))))

Lasciatemi provare a metterlo in parole:

- Voglio una classe che sia inizializzata dal costruttore e questa classe non avrà alcun metodo; lo scopo della classe è di aprire un ordine e poi chiudere e/o riaprire diversi altri ordini secondo uno script; il tipo di script è un'enumerazione

- Userò un array di istanze della classe - almeno 5

- Non voglio aprire l'ordine senza chiamare ogni volta l'ambiente terminale, quindi voglio usare SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN e il numero di cifre in SYMBOL_VOLUME_STEP come valori costanti nella classe

- Voglio un uso ottimale delle variabili, cioè non voglio duplicare le costanti del paragrafo precedente.


Questo è circa come vedo il tutto, ma in generale, il problema è ora ridotto alla struttura corretta della classe stessa, come si è scoperto già devono ereditare, in modo che SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ... per avere una copia, penso che inciamperò ancora nell'output di errore, userò qualcosa come questo dal mio PrintLastError.mqhhttps://www.mql5.com/ru/code/24829#

 
Una variabile statica, anche senza ereditarietà, sarà la stessa per tutte le istanze.