Perguntas sobre OOP em MQL5 - página 37

 
Koldun Zloy:

Tudo isso é compreensível. Não está claro porqueSetSaveRequired() eGetSaveRequired() não são estáticos, mas escrevem para uma variável estática.

Não entendo, por isso pedi ajuda. Raramente uso modificadores, mais intuitivos, mas sempre quero a melhor solução.

Deixe-me tentar no código, é assim

//+------------------------------------------------------------------+
interface IStrategy
{  double      Strategy();
   bool        Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public:
   bool              GetSaveRequired() { return(CStrategy::f_save_required); CStrategy::f_save_required = false;  }
protected:
   static bool       f_save_required;
   double            ProfitStrategy;
   void              SetSaveRequired() { CStrategy::f_save_required = true;                                       }
   void              RunStrategy();
   virtual void      NextStepStrategy();
   void              EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy(void)
{  ProfitStrategy = 0.0;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy(string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public:\
   NAME(SSettingsForOrder &set)  { m_setting = set;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_YYY::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_ZZZ::NextStepStrategy(void) { SetSaveRequired();   //...........     }


públicoGetSaveRequired() é usado em uma classe para gerenciar todo este zoológico de estratégias

com este padrão eu escrevo somente o métodoNextStepStrategy - somente nele muda para TC, todo o resto é o mesmo, e portanto na classe base CStrategy eu recolho todos os métodos e todos os campos - eles não são muito

ZS: com minhas costas eu sinto que não aceito meu código, mas ele definitivamente funcionará e não criará duplicatas da variávelf_save_required;

 
Igor Makanu:

Raramente uso modificadores, uso-os mais intuitivamente, mas como sempre, quero a melhor solução.

Deixe-me tentar no código, é assim


públicoGetSaveRequired() é usado em uma classe para gerenciar todo este zoológico de estratégias

com este padrão eu escrevo somente o métodoNextStepStrategy - somente nele muda para TC, todo o resto é o mesmo, então na classe base CStrategy eu recolho todos os métodos e todos os campos - eles não são muito

ZS: com minhas costas eu sinto que não aceito meu código, mas ele definitivamente funcionará e não criará duplicatas da variávelf_save_required;

Eu retiraria estas funções por completo.

Todas as funções que não alteram a estrutura, as tornam constantes.

Todas as funções não-constantes devem colocar bandeira de escrita.

Eu também adicionaria a função Save( int fileHandle ). Esta função deve escrever a estrutura e reiniciar a bandeira.

Você pode fazer uma função estática para obter o estado da bandeira.

if( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 10; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose( fileHandle );
}
 
Koldun Zloy:

Eu retiraria estas funções por completo.

Tornar constantes todas as funções que não alteram a estrutura.

Todas as funções não-constantes devem colocar bandeira de escrita.

Estou lhe dizendo, estou tendo problemas com os modificadores em geral.


SZY: enquanto isso o que está acontecendo em geral na web na discussão de programação - aqui estava um artigo sobre const on hobber no mês passado, o significado - esta const não é necessária, look assembler code não é diferente sem const - o compilador vai tirar tudo ((

 
Igor Makanu:

Estou lhe dizendo, estou tendo problemas com os modificadores em geral.

Eu pesquisei, li, algo deu errado novamente...

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

espera-se que sejaimpresso("const") pelo menos uma vez;
 
Igor Makanu:

Procurei no Google, li, algo deu errado novamente...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

espera-se que sejaimpresso("const") pelo menos uma vez;
class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }
Isto é uma sobrecarga para uma classe constante.
 
Vladimir Simakov:
Isto é uma sobrecarga para uma classe constante.

Hmmm... certo, eu passei quase meia hora lendo tanto o centro como os fóruns, mas não consegui pegar o jeito.

Obrigado! Agora eu tenho-o

Ainda existe a suspeita de tal exemplo:

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  const void f(int v) { x = v; Print("(const) x = v ");  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const


deu os mesmos valores, mas a questão é bem diferente? - Então você precisa novamente da ajuda do salão.
 
No momento, estou sentado em uma palestra sobre o OOP. Talvez eu compartilhe algo útil com você )).
Eu posso baixar a palestra atual. Até agora, é claro, as coisas triviais.
 
Nikolai Semko:
Neste momento estou assistindo a uma palestra sobre o OOP. Talvez eu compartilhe o que vou aprender :))
Eu posso baixar a palestra atual. Até agora, é claro, as coisas triviais.

Bem, sua palestra é muito provavelmente em algaravia, enquanto aqui você mal pode aprender nada em russo, você já deu a terceira volta pela Internet... a situação geral é sombria como aqui no fórum, verdadeiros programadores - não mais que 10 pessoas em recursos, o resto são nerds

Ok, a situação geral foi esclarecida com const, eu trabalhei com o resto dos modificadores, então eu tenho muita teoria ... Eu preciso aplicá-lo, mas me sinto como um estudante ))))

 
Igor Makanu:

Bem, sua palestra é muito provavelmente em algaravia, enquanto aqui você mal pode aprender nada em russo, você já deu a terceira volta pela Internet... a situação geral é semelhante àquela aqui no fórum, não há mais de 10 programadores reais e os demais são nerds

Ok, a situação geral foi resolvida com const, eu trabalhei com o resto dos modificadores, então já tive teoria suficiente... Eu me sinto como um estudante )))).

Sim, eu também tenho uma situação semelhante. Aprender não é difícil, é mais difícil de se reciclar, quebrar velhos hábitos. Eu ainda não consigo dar pontapés em muitos maus hábitos de programação de procedimentos.

 
Igor Makanu:

Eu gostaria de um exemplo, estou lhe dizendo, não sou nada bom com modificadores.


SZY: além disso, em geral, o horror que está acontecendo na web na discussão de programação - aqui estava um artigo sobre const on hobber no mês passado, o significado - sim, esta const não é necessária, look assembler code não difere que sem const - o compilador irá remover tudo (((

Você pode simplesmente esquecer as constantes e estáticas por enquanto. Nas interfaces também.

E quando tudo estiver pronto, então olhe e marque algo como uma estática e algo como uma constante. E você pode esquecer completamente as interfaces.