Preguntas sobre POO en MQL5 - página 19

 
Vladimir Simakov:
Tengo la suposición de que no habrá ningún lote, por ejemplo 0,15. Al menos yo no he oído hablar de ello. Si lo hago, lo cambiaré.

Sé que es poco probable, pero uno siempre quiere la solución perfecta ))))

Vale, no es el mayor problema, pero me he creado un problema... Quería un OOP perfecto, pero sin llamadas innecesarias y que todo fuera óptimo

Quiero tener 5 instancias de la clase, pero necesito inicializar los campos de la clase una vez - contienen el entorno del terminal, que no cambiará durante la ejecución del programa.

string         Language;

Si declaro la cadena estática Language; - entonces habrá un error de variable estática no resuelta 'A::Language'

aquí hay un ejemplo

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

Voy a inicializar el lenguaje de la cadena 5 veces en esta forma - es incorrecto y no va a compilar con modificadores estáticos

¡y no hay necesidad de tener 5 copias de la variable Idioma! - intentó en la clase B declarar una instancia de la clase - lo mismo 5 Las variables del lenguaje tienen

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

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:

Sé que es poco probable, pero uno siempre quiere la solución perfecta ))))

Vale, no es el mayor problema, pero me he creado un problema... Quería un OOP perfecto, pero sin llamadas innecesarias y que todo fuera óptimo

Quiero tener 5 instancias de la clase, pero necesito inicializar los campos de la clase una vez - contienen el entorno del terminal, que no cambiará durante la ejecución del programa.

Si declaro la cadena estática Language; - entonces habrá un error de variable estática no resuelta 'A::Language'

aquí hay un ejemplo

Inicializaré la cadena Language 5 veces en este formulario - no es correcto, y no compila con modificadores estáticos

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

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, esa es una opción

Pero quiero envolverlo todo en una clase - en mi ejemplo tengo la clase B y quiero 5 instancias de B, pero no quiero inicializarLanguage 5 vecesy por lo tanto no quiero tener una variableLanguage en cada instancia

¿Cómo puedo deshacerme dela Lengua extra?

 
Igor Makanu:

OK, esa es una opción

Pero quiero envolverlo todo en una clase - en mi ejemplo tengo la clase B y quiero 5 instancias de B, pero no quiero inicializar Language 5 veces y por lo tanto no quiero tener una variableLanguage en cada instancia

¿Cómo puedo deshacerme del exceso deLengua?

Heredar. De este modo, sólo se inicializará una vez.

 
Igor Makanu:

Sé que es poco probable, pero uno siempre quiere la solución perfecta ))))

Bueno, no es el mayor problema, pero me he creado un problema... Quería un OOP perfecto, pero sin llamadas innecesarias y que todo fuera óptimo

Quiero tener 5 instancias de la clase, pero necesito inicializar los campos de la clase una vez - contienen el entorno del terminal, que no cambiará durante la ejecución del programa.

Si declaro la cadena estática Language; - entonces habrá un error de variable estática no resuelta 'A::Language'

aquí hay un ejemplo

Voy a inicializar el lenguaje de la cadena 5 veces en esta forma - es incorrecto y no va a compilar con modificadores estáticos

¡y no hay necesidad de tener 5 copias de la variable Idioma! - intentó en la clase B declarar una instancia de la clase - lo mismo 5 Las variables del lenguaje tienen

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

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

Estoy en mi teléfono ahora mismo. Recuérdame esta noche y te mostraré cómo resolverlo.
 
Andrey Barinov:

Heredar. De esta forma, sólo se inicializará una vez.

A mí me funciona

//+------------------------------------------------------------------+
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: inicializado

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


al menos se llama a myTerminalInfoString() una vez


Así que tengo una especie de Singleton

Gracias.

 
Vladimir Simakov:
Estoy en mi teléfono ahora mismo. Recuérdamelo por la noche y te mostraré cómo resolverlo.

Vale, si no es mucha molestia.

y el tema de Singleton es bastante nuevo para mí, hay espacio para la creatividad - los ejemplos serían

 
Igor Makanu:

Vale, si no es mucha molestia.

y el tema de Singleton es bastante nuevo para mí, hay espacio para la creatividad - los ejemplos serían

Entonces, ¿quieres un singleton o un campo general para objetos?
 
Vladimir Simakov:
Entonces, ¿es necesario un campo común para los objetos?

es difícil decir lo que quiero ))))

Permítanme que intente expresarlo con palabras:

- Quiero una clase que sea inicializada por el constructor y esta clase no tendrá ningún método; el propósito de la clase es abrir una orden y luego cerrar y/o reabrir varias órdenes más según un script; el tipo de script es una enumeración

- Utilizaré una matriz de instancias de la clase - al menos 5

- Por lo tanto, quiero utilizar SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN y el número de dígitos en SYMBOL_VOLUME_STEP como valores constantes en la clase

- Quiero un uso óptimo de las variables, es decir, no quiero duplicar las constantes del párrafo anterior.


Eso es más o menos como lo veo todo, pero en general, el problema se reduce ahora a la estructura correcta de la clase en sí, como resultó ya tienen que heredar, por lo que SYMBOL_VOLUME_MAX , Símbolo,SYMBOL_VOLUME_MIN ... para tener una copia, creo que seguiré tropezando con la salida de error, usaré algo así de mi PrintLastError.mqhhttps://www.mql5.com/ru/code/24829#

 
Una variable estática, incluso sin herencia, será la misma para todas las instancias.
Razón de la queja: