Discussão do artigo "Os Fundamentos da programação orientada a objetos" - página 3

 

1) Achei que havia um erro aqui:

Seção: Passando parâmetros para o construtor

"A função Init() está separada na seção private para garantir que a classe possa ser reinicializada."

possível:

A função Init() está reservada na seção pública para oferecer a possibilidade de reinicializar a classe.

2) Dê um exemplo de uso do recurso"create an array with class instances (objects)" para a seção "ObjectArray". Infelizmente, não consigo descobrir "para que isso é usado".

3) Na seção "Mais sobre encapsulamento (privado, protegido, público)", a classe base->classe descendente é mencionada de passagem. Talvez esse dado(class Class: public CBase) devesse ser explicado no início da seção, pois percebi isso mais tarde.

4) não encontrou:Fig.6. A visibilidade da função "extra" (seta vermelha) é determinada pelo tipo de ponteiro com o qual a classe é carregada. Esse exemplo pode ser encontrado no apêndice, no arquivo OOP_sDefaultVirtual_1.mq5.

5) Não encontrei uma indicação clara do que é uma biblioteca. Aparentemente, uma forma de armazenar a(s) classe(s) das funções? Ou seja, semelhante ao arquivo de inclusão, só que o arquivo de inclusão é armazenado como fonte, e a biblioteca como uma dll compilada?

Muito obrigado pelo artigo! Fiquei especialmente satisfeito com a apresentação consistente do material.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) Achei que havia um erro aqui:

Seção: Passando parâmetros para o construtor

"A função Init() está separada na seção private para garantir que a classe possa ser reinicializada."

possível:

A função Init() está reservada na seção pública para oferecer a possibilidade de reinicializar a classe.

2) Dê um exemplo de uso do recurso"create an array with class instances (objects)" para a seção "ObjectArray". Infelizmente, não consigo descobrir "para que isso é usado".

3) Na seção "Mais sobre encapsulamento (privado, protegido, público)", a classe base->classe descendente é mencionada de passagem. Talvez esse dado(class Class: public CBase) devesse ser explicado no início da seção, pois percebi isso mais tarde.

4) não encontrou:Fig.6. A visibilidade da função "extra" (seta vermelha) é determinada pelo tipo de ponteiro com o qual a classe é carregada. Esse exemplo pode ser encontrado no apêndice, no arquivo OOP_sDefaultVirtual_1.mq5.

5) Não encontrei uma indicação clara do que é uma biblioteca. Aparentemente, uma forma de armazenar a(s) classe(s) das funções? Ou seja, semelhante ao arquivo de inclusão, só que o arquivo de inclusão é armazenado como fonte, e a biblioteca como uma dll compilada?

Muito obrigado pelo artigo! Fiquei especialmente satisfeito com a apresentação consistente do material.

1. Sim.

2. Há um exemplo na seção "Array of objects"; na verdade, a seção inteira é um exemplo com uma descrição.

3. Isso é considerado na seção "Uso da OOP para alterar a lógica de operação do programa".

4. As palavras "This example is in the appendix in the file..." (Este exemplo está no apêndice do arquivo...) significa que o arquivo contém um exemplo para a seção indicada pelo cabeçalho da seção. Isso não significa que os exemplos duplicam tudo o que está escrito no artigo. Esses exemplos podem não existir, pois tudo está escrito no artigo. Mas os exemplos estão lá, você pode tomá-los como base e fazer experiências. O artigo é o principal, os exemplos são secundários.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Excluído]  
Obrigado. Bom artigo.
[Excluído]  

Artigo muito interessante, escrito em uma linguagem competente e "acessível".

Obrigado ao autor.

 
Obrigado, cara. Esse artigo me ajudou muito. Eu estava migrando meu EA para OOP e estava tendo um problema especial com arrays de classes. Os ponteiros dinâmicos foram explicados de forma clara e perfeita. Mais uma vez, obrigado.
 
Artigo muito bem escrito! Finalmente me dei conta disso graças ao autor.
 

Tenho dois exemplos de código baseados/copiados deste artigo. Ambos criam uma matriz de ponteiros para uma classe e os excluem ao sair. No entanto, um sai com um vazamento de memória e o outro sai sem vazamento de memória. A única diferença é que o segundo exemplo tem o 'Alert' no destrutor comentado. Quando o alerta no destrutor é removido, há um vazamento de memória. Isso é muito estranho. Alguém pode explicar??? Por favor, ajudem, isso está me deixando LOUCO.

No final dos exemplos de código deste artigo, incluí um exemplo extremamente simples de código que escrevi e que também tem um vazamento de memória. Novamente, por que ???? Não há nada complicado nesse exemplo final de código...


Esse código funciona sem vazamento de memória:

class CName
  {
private:
   int               m_arg; // Variável para a instância
public:
                     CName(int aArg)
     { // Construtor
      m_arg=aArg;
      //Alerta("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destruidor
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Matriz

void OnInit()
  {
// Preparar a matriz para carregar dez instâncias da classe
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Carregar instâncias
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // No final, descarregue todas as instâncias da memória
      delete(cname[i]);
     }
}

Mensagens do registro especializado, observe que não há vazamento de memória:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 2

EN 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 9

Esse código sai COM um vazamento de memória!!!! Why????????? A única diferença é comentar o 'Alert' no destrutor...

class CName
     {
private:
   int               m_arg; // Variável para a instância
public:
                     CName(int aArg)
     { // Construtor
      m_arg=aArg;
      //Alerta("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destruidor
      //Alerta("Destructor "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // Matriz

void OnInit()
  {
// Preparar a matriz para carregar dez instâncias da classe
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Carregar instâncias
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // No final, descarregue todas as instâncias da memória
      delete(cname[i]);
     }
}

Mensagens do registro especializado, observe o vazamento de memória:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 objetos não excluídos restantes

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 Restam 10 objetos do tipo CName

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 bytes de memória vazada

Exemplo final , meu código, muito simples, mas sai com um vazamento de memória....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Função de inicialização especializada|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Mensagens do registro de especialistas, observe o vazamento de memória:

MR 0 tester (EURUSD,M1) 14:07:23 Last Error- 0 Hora atual: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 10 objetos não excluídos restantes

KN 1 tester (EURUSD,M1) 14:07:23 10 objetos do tipo CCandleStick restantes

JS 1 tester (EURUSD,M1) 14:07:23 160 bytes de memória vazada



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

Tenho dois exemplos...

Verifiquei todas as três varaints. Todas as três são idênticas. Todas estão normais. Nenhuma apresenta vazamentos. Nesses exemplos, não pode ser - temos a matriz, em cada elemento da matriz há uma instância e, ao terminar, excluímos todos os objetos. Os objetos não criam cópias de si mesmos, você não pode deixar de excluir algo. Se o objeto cria uma cópia de si mesmo, então podemos ter dificuldades com a exclusão, pois é muito fácil perder alguma coisa. Mostre as variantes que realmente têm vazamento.

Use o botão SRC para inserir o código (melhor ainda - anexar arquivos).

Desculpe-me pelo meu inglês:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
A OOP é uma linguagem de programação moderna, mas para entendê-la e escrever o código precisamos de muito tempo e dedicação. Obrigado pelo bom artigo
 
Integer:

Verifiquei as três varetas. As três são idênticas. Todas estão normais. Nenhuma apresenta vazamentos. Nesses exemplos, não pode ser - temos a matriz, em cada elemento da matriz há uma instância e, ao terminar, excluímos todos os objetos. Os objetos não criam cópias de si mesmos, você não pode deixar de excluir algo. Se o objeto cria uma cópia de si mesmo, então podemos ter dificuldades com a exclusão, pois é muito fácil perder alguma coisa. Mostre as variantes que realmente têm vazamento.

Use o botão SRC para inserir o código (melhor ainda - anexar arquivos).

Desculpe-me pelo meu inglês:)

Muito obrigado por dedicar seu tempo para responder. Não sei se você viu minha pergunta de acompanhamento. Ela estava em um comentário separado que provavelmente foi excluído porque não estou muito familiarizado com este fórum. No entanto, tentei executar todos os três exemplos em um computador mais antigo com uma versão mais antiga do MetaTrader. Na versão mais antiga, todos os três pareciam funcionar bem. Ele não gerou um erro de "vazamento de memória" no registro do expert, acho que era a versão 560???Acredito que era a versão 560?? não me lembro e atualizei a 560 para a nova versão 756. Após a nova versão, tenho os mesmos problemas de vazamento de memória. É possível que a versão antiga não tenha relatado os problemas de vazamento de memória porque não era um recurso? Qual versão você está usando? Mais uma vez, obrigado.