Perguntas sobre OOP em MQL5 - página 43

 
Igor Makanu:

SZS: Seus cargos são quase sempre razoáveis, mas a apresentação do material, bem, não exatamente com boas intenções, é claro, mas imho, você quer ajudar - ajudar, quer ser inteligente, bem, muitas vezes acontece assim

O tom faz você pensar... você escreveu que começou a pensar no código, e antes de codificar, ao cair de um chapéu...

 
A100:

O tom faz você pensar... você escreveu que começou a pensar no código, e antes disso você estava codificando com pressa.

hmm... bem, eu nunca escrevi uma esquiva! - isso é um fato!

SZZY: Atualizo o tópico periodicamente não por ignorância ou porque não consigo encontrar o material, mas porque há um agente cuja opinião é interessante para mim ;)

ZSYS: o resultado da comunicação - um pouco repensado porque usar modificadores, porque precisamos de um get/set - poupa tempo no estágio de desenvolvimento, com o uso hábil do compilador, testar o código escrito será imediatamente bem sucedido - aqui realmente abriu os olhos, que foi um trunfo no tópico, mais uma vez, obrigado!

 
Koldun Zloy:

Aqui está um exemplo:

De seu código, não está claro para que serve a interface, então eu a joguei fora.

É claro que não conheço completamente sua tarefa, mas há 99,99% de chances de que não seja necessária.

Malvado...

 
Igor Makanu:

Um... Eu nunca escrevi em um borrão! - isso é um fato!

SZZY: Eu atualizo periodicamente este tópico não por ignorância, ou porque não consigo encontrar material por conta própria, mas porque existe um bem, cuja opinião me interessa ;)

SZZY: o resultado da comunicação - um pouco repensado por que usar modificadores, por que precisamos de um get/set - poupa tempo na fase de desenvolvimento, com uso hábil do compilador, testar o código escrito será imediatamente bem sucedido - aqui realmente abriu os olhos, que foi uma vantagem no tópico, mais uma vez, obrigado!

É muito bom que você tenha aprendido alguma coisa. Mas você pode fazer muito mais progresso se ler o C+++ da Stroustrup.

Mas é melhor que você não leia artigos e vários vídeos sobre Habra. Qualquer pessoa pode escrever lá. Eles só vão confundir você.

 

Surgiu uma pergunta.


Há um painel com botões, cada botão executará algumas funções. As funções chamadas pressionando um dos botões, vamos chamá-lo de Exit1, devem ser colocadas em uma classe separada CExit1.

Mas estas funções utilizam algumas variáveis e métodos globais de outros objetos.

Eu não participei de grandes projetos. Eu gostaria de saber a opinião de especialistas, como fazê-lo corretamente?

Muitas vezes programo de tal forma que se um arquivo mq4 for compilado, todas as classes e arquivos inclusos são carregados sem erros e a EA funciona corretamente. Entretanto, se eu compilar uma classe separadamente, recebo avisos porque algumas variáveis e funções externas não são visíveis.

Eis a minha pergunta. Uma classe tem que se compilar sem erros, quer dizer, tem que conter todas as cópias das variáveis globais da EA, referências de objetos, etc., que são usadas? Em caso afirmativo, quando seria o melhor momento para fazer isso? Se há muitos objetos interagindo, como organizá-los para que haja menos confusão? Você cria esquemas para seus programas se eles proliferarem?

Compartilhe como você escreve e implementa o trabalho com seus objetos.

 
Vasiliy Pushkaryov:

Surgiu uma pergunta.


Há um painel com botões, cada botão executará algumas funções. As funções chamadas pressionando um dos botões, vamos chamá-lo de Exit1, devem ser colocadas em uma classe separada CExit1.

Mas estas funções utilizam algumas variáveis e métodos globais de outros objetos.

Eu não participei de grandes projetos. Eu gostaria de saber a opinião de especialistas, como fazê-lo corretamente?

Muitas vezes programo de tal forma que se um arquivo mq4 for compilado, todas as classes e arquivos inclusos são carregados sem erros e a EA funciona corretamente. Entretanto, se uma classe é compilada separadamente, alguns avisos podem aparecer, porque algumas variáveis e funções externas não são visíveis para a classe.

A questão é. É necessário que a própria classe compile sem erros, quero dizer, que já contenha todas as cópias usadas de variáveis globais, referências a objetos, etc.? Em caso afirmativo, quando seria o melhor momento para fazer isso? Se há muitos objetos interagindo, como organizá-los para que haja menos confusão? Você cria diagramas de seus programas se eles se proliferam?

Compartilhe como você escreve e implementa o trabalho com seus objetos.

As variáveis e estatísticas globais, exceto aquelas inerentes à plataforma, são uma coisa má. E todas as entidades (grupos de classes) devem ser isoladas e se comunicar entre si de acordo com um protocolo (o da Interface) e nada mais.

Este é, naturalmente, o ideal :-) Na vida real você toma a decisão e se apóia, porque ninguém mais conhece seu projeto, sua idéia e seu estilo.

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. Por que ele não compila?

2. Existe um hack para descrever operator= , e usar o operador de cópia nativo nele? .... ou seja, alguma forma de chamar::=

 
Igor Makanu:

1. Por que ele não compila?
2. Existe um hack para descrever operator= , e usar o operador de cópia nativo nele? .... ou seja, alguma forma de chamar ::=

1) operador de atribuição padrão em MQL retorna tipo de dados nulos;
2) você pode fazer algo como isto:

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1) o operador de atribuição padrão na MQL retorna o tipo de dados nulos;

não estão de acordo:

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


Claramente o operador de atribuição padrão retorna o tipo de dados completo e faz uma cópia, ou de que vazio estamos falando?


2. o exemplo é bom, mas eu quero preservar a possibilidade de copiar em estruturas de array usando o operador de cópia padrão - eu verifiquei, em geral funciona muito bem com arrays dinâmicos, há algumas nuances, mas a questão é diferente por enquanto

 
Igor Makanu:

O operador de atribuição padrão retorna claramente o tipo de dados completo e faz uma cópia, ou de que vazio estamos falando?

Errado.

Basta definir seu operador=, que retorna isto, e você verá a diferença.

Você pode vê-lo quando o resultado da tarefa for atribuído novamente.

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}
Razão: