Perguntas sobre OOP em MQL5 - página 19

 
Vladimir Simakov:
Tenho uma suposição de que não haverá muito, por exemplo, 0,15. Pelo menos eu não ouvi falar sobre isso. Se eu fizer isso, eu o mudarei.

Eu sei que é improvável, mas você sempre quer a solução perfeita ))))

Ok, não é o maior problema, mas eu criei um problema para mim mesmo... Eu queria um OOP perfeito, mas sem ligações desnecessárias e tudo estava otimizado.

Eu quero ter 5 instâncias da classe, mas preciso inicializar os campos de classe uma vez - eles contêm ambiente terminal, que não mudará durante a execução do programa.

string         Language;

Se eu declarar linguagem de cadeia estática; - então haverá um erro não resolvido da variável estática 'A::Language'.

aqui está um exemplo

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

Inicializarei a linguagem de corda 5 vezes nesta forma - está errada e não será compilada com modificadores estáticos

e não há necessidade de ter 5 cópias da variável Idioma! - tentou, na classe B, declarar uma instância da classe - o mesmo que 5 variáveis de idioma têm

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: razão uninit 3

 
Igor Makanu:

Eu sei que é improvável, mas você sempre quer a solução perfeita ))))

Ok, não é o maior problema, mas eu criei um problema para mim mesmo... Eu queria um OOP perfeito, mas sem ligações desnecessárias e tudo estava otimizado.

Eu quero ter 5 instâncias da classe, mas preciso inicializar os campos de classe uma vez - eles contêm ambiente terminal, que não mudará durante a execução do programa.

Se eu declarar linguagem de cadeia estática; - então haverá um erro não resolvido da variável estática 'A::Language'.

aqui está um exemplo

Inicializarei a linguagem de corda 5 vezes nesta forma - está errada, e não se compila com 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: razão uninit 3

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

OK, essa é uma opção

Mas eu quero envolver tudo em uma classe - no meu exemplo eu tenho classe B e quero 5 instâncias de B, mas não quero inicializar oIdioma 5 vezese, portanto, não quero ter uma variável deIdioma em cada instância

Como posso me livrar de umidioma extra?

 
Igor Makanu:

OK, essa é uma opção

Mas eu quero envolver tudo em uma classe - no meu exemplo eu tenho classe B e quero 5 instâncias de B, mas não quero inicializar o Idioma 5 vezes e, portanto, não quero ter uma variável deIdioma em cada instância

Como posso me livrar de umidioma extra?

Herdar. Desta forma, ela só será inicializada uma vez.

 
Igor Makanu:

Eu sei que é improvável, mas você sempre quer a solução perfeita ))))

Bem, não é o maior problema, mas criei um problema para mim mesmo... Eu queria um OOP perfeito, mas sem ligações desnecessárias e tudo estava otimizado.

Eu quero ter 5 instâncias da classe, mas preciso inicializar os campos de classe uma vez - eles contêm ambiente terminal, que não mudará durante a execução do programa.

Se eu declarar linguagem de cadeia estática; - então haverá um erro não resolvido da variável estática 'A::Language'.

aqui está um exemplo

Inicializarei a linguagem de corda 5 vezes nesta forma - está errada e não será compilada com modificadores estáticos

e não há necessidade de ter 5 cópias da variável Idioma! - tentou, na classe B, declarar uma instância da classe - o mesmo que 5 variáveis de idioma têm

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: razão uninit 3

Estou no meu telefone agora mesmo. Lembre-me hoje à noite e eu lhe mostrarei como resolver isso.
 
Andrey Barinov:

Herdar. Nesta forma, ela só será rubricada uma vez.

Funciona para mim

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


pelo menos myTerminalInfoString() é chamado uma vez


Então eu meio que tenho um Singleton

Obrigado!

 
Vladimir Simakov:
Estou no meu telefone agora mesmo. Lembre-me à noite e eu lhe mostrarei como resolver isso.

OK, se não for muito incômodo.

e o tema Singleton é bastante novo para mim, há espaço para a criatividade - exemplos seriam

 
Igor Makanu:

OK, se não for muito incômodo.

e o tema Singleton é bastante novo para mim, há espaço para a criatividade - exemplos seriam

Então, você quer um campo de um só botão, ou um campo geral para objetos?
 
Vladimir Simakov:
Então, você precisa de um campo comum para os objetos?

é difícil dizer o que eu quero ))))

Deixe-me tentar colocar isso em palavras:

- Quero uma classe que seja inicializada pelo construtor e esta classe não terá métodos; o objetivo da classe é abrir uma ordem e depois fechar e/ou reabrir várias outras ordens de acordo com um roteiro; o tipo de roteiro é uma enumeração

- Vou utilizar uma série de instâncias da classe - pelo menos 5

- Não quero abrir o pedido sem chamar sempre o ambiente do terminal. Portanto, quero usar SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN e o número de dígitos em SYMBOL_VOLUME_STEP como valores constantes na classe

- Quero uma utilização ótima das variáveis, ou seja, não quero duplicar as constantes do parágrafo anterior.


É assim que eu vejo tudo, mas, em geral, o problema agora se reduz à estrutura correta da própria classe, como acabou tendo que herdar, de modo que SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ... para ter uma cópia, acho que ainda vou tropeçar na saída do erro, vou usar algo assim do meu PrintLastError.mqhhttps://www.mql5.com/ru/code/24829#

 
Uma variável estática, mesmo sem herança, será a mesma para todas as instâncias.
Razão: