Perguntas sobre OOP em MQL5 - página 41

 
Igor Makanu:

olhou os resultados da minha batalha com o código estilo OOP - hmmm... excelente! ))))


Eu tenho uma pergunta, mas em meu código, bem, três vezes exatamente, eu uso uma construção como:

chama tudo em métodos privados, mas existe um "método Jedi ?" para escapar no código fonte do CheckPointer(m_order)==POINTER_INVALID

Estou perguntando sobre alguns get / set

nenhum problema especial, mas por assim dizer um capricho, ou enquanto a sede de conhecimento dos métodos OOP em C++ ainda não diminuiu

Se a pergunta for "muitas letras", então !CheckPointer(mPtr), e se a função chamar, você inicializa todos os ponteiros para NULL no construtor e compara com ele no código, não esquecendo ao apagar ptr; ptr=NULL;

 
Igor Makanu:

olhou os resultados da minha batalha com o código estilo OOP - hmmm... excelente! ))))


Eu tenho uma pergunta, mas em meu código, bem, três vezes exatamente, eu uso uma construção como:

chama tudo em métodos privados, mas existe um "método Jedi ?" para escapar no código fonte do CheckPointer(m_order)==POINTER_INVALID

Estou perguntando sobre alguns get / set

nenhum problema especial, mas por assim dizer um capricho, ou enquanto a sede de conhecimento dos métodos OOP em C++ ainda não diminuiu


Igor, veja este exemplo, eu acho que é isso que você está perguntando.

 
Vladimir Simakov:

Se a pergunta for "muitas letras", então !CheckPointer(mPtr), e se em uma chamada de função, você rubricar todos os ponteiros para NULL no construtor e comparar com ele no código, não esquecendo ao apagar ptr; ptr=NULL;

Bem e isto, para o açúcar:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

Nenhum problema especial, mas por assim dizer um capricho, ou enquanto a sede de aprender os métodos OOP em C++ ainda não tiver morrido.

Recomendo vivamente que você inicialize todos os campos da classe com valores padrão no construtor. A questão é que, se você quiser fazer isso:

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

ninguém inicializará os campos da sua classe e haverá valores de lixo.

 
Vladimir Simakov:

E isto, para o açúcar:

Não, eu quase desisti das definições, só não quero embrulhar nada, como escrevi há algumas semanas - quero ver código puro estilo OOP por enquanto, avaliar flexibilidade e possibilidades

HH: Eu apenas envolvi os descendentes em definição na criação, não para escrever a mesma inicialização em 3 linhas, é mais fácil adicionar métodos mais tarde, ou seja, no código fonte em uma linha até agora

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
Romano:


Igor, dê uma olhada neste exemplo, acho que é isso que você está perguntando.

não, eu quero dizer o equivalente em c# - operador ?? ( operador nulo), algo semelhante em lógica que quero ver no estilo C++


UPD:

Vladimir Simakov:

Recomendo vivamente a inicialização de todos os campos de uma classe com valores padrão no construtor. A questão é que se você quiser fazer

Se você estiver pedindo uma macro, ninguém vai rubricar os campos de sua classe e haverá valores de lixo.

foi o que eu fiz, construtor com a inicialização de tudo e qualquer coisa na classe base, os descendentes inicializam a classe base:

foi o que eu embrulhei em uma macro, assim eu não esqueceria de inicializar corretamente ))))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

Não, eu quase desisti das definições, só não quero embrulhar nada, como escrevi há algumas semanas - quero ver código puro estilo OOP por enquanto, avaliar flexibilidade e possibilidades

ZS: somente os descendentes embrulhados em definição na criação, para não escrever a mesma inicialização em 3 linhas, é mais fácil adicionar métodos mais tarde, ou seja, no código fonte em uma linha por enquanto

não, eu quero dizer o equivalente em c# - operador ?? ( operador nulo ), quero ver algo semelhante em lógica no estilo C++

O pré-processador é uma perda de tempo. Junto com os modelos, eles são as ferramentas mais fortes. Parece não haver um análogo do operador ?? O C++ é mais difícil a este respeito.
 
Vladimir Simakov:
Sua recusa do pré-processador é em vão. Junto com os modelos, eles são as ferramentas mais poderosas. Parece não haver um análogo do operador ?? O C++ é mais difícil a este respeito.

Ainda estou em uma batalha pelo puro estilo OOP, quero aprender todas as técnicas OOP, enquanto há uma vantagem no fórum ;)

Estou a par do pré-processador, mas ... Acho que não devo abusar, pelo menos não do meu estilo, posso estragar tudo, e certamente não serei capaz de ler código com múltiplas macrossubstituições, e como procurar por bugs... bem, é mais fácil de reescrever - então, ainda não é necessário


modelos... Bem, eu não gosto do que os desenvolvedores oferecem em SB, eu olhei através de todos eles, é difícil dizer para que propósito eles foram incluídos em SB, talvez sua hora ainda não tenha chegado

sobre os modelos C++ portando para a MQL - é hora, como a discussão mostrou, de que na maioria dos casos os modelos C++ exigem um ajuste fino para a MQL - é mais fácil voltar para .dll e não incomodar a MQL ))))

 
Igor Makanu:

Ainda estou em uma batalha pelo puro estilo OOP, quero aprender todas as técnicas OOP, enquanto há uma vantagem no fórum ;)

Estou a par do pré-processador, mas ... Acho que não devo abusar, pelo menos não do meu estilo, posso estragar tudo, e certamente não serei capaz de ler código com múltiplas macrossubstituições, e como procurar por bugs... bem, é mais fácil de reescrever - então, ainda não é necessário


modelos... Bem, eu não gosto do que os desenvolvedores oferecem em SB, eu olhei através de todos eles, é difícil dizer para que propósito eles foram incluídos em SB, talvez sua hora ainda não tenha chegado

sobre os modelos C++ portando para a MQL - é hora, como a discussão mostrou, de que na maioria dos casos os modelos C++ exigem um ajuste fino para a MQL - é mais fácil voltar para .dll e não incomodar a MQL ))))

Você pode escrever seus próprios modelos dessa maneira)).
 
Vladimir Simakov:
Você mesmo pode escrever os modelos dessa maneira))))

Yup ))))

Acabei de ler a ajuda e pulei a anulação, graças a Deus tudo está em macros, edições, bem, exatamente em uma cópia-colar

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD:

não é não, saiu para o próprio controle de permissão, não há necessidade de método público!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

E depois há isto, para o açúcar:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

Eu queria escrever o que eu costumava ter em vez de

if( CheckPointer(m_order)==POINTER_INVALID )

foi assim:

if(m_order==NULL)

mas lembrou como verificar as substituições de macro em MQL

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


e se a memória me serve corretamente, no início do ano era possível desimprimir NULL no registro e chegar 0 lá , agora aparece um erro

Isto é, o comportamento NULL como se não devesse mudar no futuro, mas o que lá é substituído em vez do NULL não é claro, provavelmente se esta situação for verificada agora, como escritose(CheckPointer(m_order)==POINTER_INVALID))) )))