Perguntas sobre OOP em MQL5 - página 7

 
Dmitry Fedoseev:

Se o número de objetos é conhecido antecipadamente e é constante durante a execução do programa, então não há necessidade de novos objetos. Em todos os outros casos, você precisa de novo.

Não, aqui está meu exemplohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

é conveniente passar parâmetros para o construtor e se o usuário alterar as configurações, é mais rápido matar a classe em OnDeinit() e depois criá-la com os novos parâmetros em OnInit()

;)

 
Igor Makanu:

não, aqui está meu exemplohttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

é conveniente passar parâmetros para o construtor e se o usuário alterar as configurações, é mais rápido matar a classe em OnDeinit() e depois criá-la com os novos parâmetros em OnInit()

;)

Os parâmetros também podem ser passados para o construtor sem novos parâmetros.

 
Dmitry Fedoseev:

Os parâmetros podem ser passados para o construtor sem novos parâmetros.

Então, como você mudará os campos de classe (o usuário mudou as configurações da EA)? - Você vai escrever mais um método? Eu pensei na última página que você estava lutando por" mais umavariável para um ponteiro". "e aqui você tem todo um método!

;)

 
Igor Makanu:

e? como você mudará os campos da classe (o usuário mudou as configurações da EA)? - Você vai escrever outro método? Eu pensei na última página que você estava lutando por" mais umavariável para o ponteiro". "com que você estava lutando, e aqui está todo um método!

;)

input int a1=1;
input int a2=2;

class CX{
   public:
   void CX(int a,int b){
   
   }
};

CX cx(a1,a2);
 
Dmitry Fedoseev:

de jeito nenhum ;)

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX cx(a1,a2);  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+

alterar as configurações da EA

 
Igor Makanu:

de jeito nenhum ;)

alterar as configurações da EA

Uma emboscada fria.

Entretanto, eu preferiria acrescentar um método para alterar os parâmetros, mas não usar novos apenas por causa dos parâmetros.
 
Dmitry Fedoseev:

Uma emboscada fria.

No entanto, prefiro acrescentar um método para mudar os parâmetros, mas não use novos apenas por causa dos parâmetros.

não usar novo é uma superstição? )))

imho, se for conveniente, você deve usá-lo! - Seu exemplo será reescrito em 2 cliques usando novo e tudo funcionará corretamente e lidará com a situação quando o usuário alterar as configurações

#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX *cx;
//+------------------------------------------------------------------+
int OnInit()
  {
   cx = new CX(a1,a2);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  delete cx;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

não usar novo é superstição? )))

imho, se for conveniente, você deve usá-lo! - Seu exemplo será reescrito em 2 cliques usando novo e tudo funcionará corretamente e lidará com a situação quando o usuário alterar as configurações

Não é superstição, apenas preguiça, historicamente, devido às circunstâncias. Você tem que escrever apagar e fazer isso em Deinit(). Mas a função Deinit() não estava no modelo por padrão. Agora eu olho - o modelo EA tem Deinit(), mas não estava lá antes.

 
Dmitry Fedoseev:

Não é superstição, apenas preguiça, historicamente, devido às circunstâncias. Devemos escrever apagar, e fazer isso em Deinit(). Mas a função Deinit() não estava presente no modelo por padrão. Estou procurando agora - há Deinit() no modelo EA, mas ele não estava lá antes.

Não escreva apagar - tudo vai funcionar corretamente, este pecado (quero dizer superstição) ) ) assumirá o terminal e murmurará no registro "48 bytes de memória vazada", "2 objetos do tipo CX à esquerda" e "objetos não apagados à esquerda".

HH: no modelo indicador não há nenhum Deinit() - isto é irritante

 
Igor Makanu:

não escrever apagar - tudo vai funcionar corretamente, este pecado (quero dizer superstição)) ) assumirá o terminal e murmurará em seu registro "48 bytes de memória vazada", depois "2 objetos do tipo CX à esquerda" e "objetos não apagados à esquerda".

SZY: em um modelo de criação do indicador não há nenhum Deinit() - ele estica

Funcionará sem apagar, mas é inútil. Mas será que o terminal resolve este problema? Ele apenas relata vazamentos de memória, mas não dedica os mesmos objetos.