Perguntas sobre OOP em MQL5 - página 14

 
TheXpert:

também está sob a custódia dos moderadores

Quem disse alguma coisa sobre custódia... mas um personagem com duas excentricidades...

 
TheXpert:

também sob a tutela dos moderadores

Pensei ter apagado meu próprio posto.
 
Vladimir Simakov:
Pareço ter apagado meu próprio posto.

Este era o caso quando um objeto é criado em uma função através de uma nova função. Originalmente, falávamos em passar um ponteiro para um objeto existente. E aqui, pode ser passado desta maneira:

nulo f(CObj * obj){}

 
Dmitry Fedoseev:

E se um ponteiro precisa ser passado para uma função para criar um objeto na função, é assim que ela funciona:

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
Isso é tudo o que você queria saber sobre o OOP, mas estava com medo de perguntar))))

Este código me dá o pontapé de saída para o terminal. Na melhor das hipóteses, ele causa um erro crítico na depuração (para animação clique na imagem):


Estranho que tal construção seja ignorada pelo compilador.

 
Rapazes, parem de brigar entre vocês, especialmente em igualdade de condições.
Dmitry deu o primeiro exemplo com um erro, e o que há de errado com isso?
Dim, sim, ele compila sem erros, mas quando você executa o script, um erro aparece.

Vladimir corrigiu-o e acrescentou um ponteiro, o código funcionou corretamente.
O que mais precisamos? Agora temos que descobrir quem é o mais legal? ))))
Rapazes, sejam respeitosos uns com os outros e não recorram a personalidades e insultos com arrogância.

Exemplo inicial de Dimitri
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Correção por Vladimir.
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Minha correção com uma impressão do resultado do método, para verificar
Este exemplo agora está funcionando, o que mais você precisa?
Pare de tentar descobrir quem é mais frio ou não, todo mundo tem erros de digitação e erros.
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
No decorrer destes argumentos, acho que identificamos um erro de compilação.
Por que o compilador pula a compilação do exemplo inicial de Dmitri sem erros?
 
Vasiliy Sokolov:

Este código me dá o pontapé de saída para o terminal. Na melhor das hipóteses, causa um erro crítico de depuração:

É estranho que uma tal construção seja passada pelo compilador.

Tudo é válido para o compilador aqui.

Um ponteiro para um objeto no segmento de dados do programa é criado e é 0x0 iniciado durante a compilação.

Os comandos necessários para o processador são criados no segmento de código.

Em tempo de execução, os comandos são levantados na pilha no endereço da função z(...).

E lá move rdx [0x0]

E o acesso a um endereço de memória nulo é proibido. O desreferenciamento de um ponteiro nulo é chamado

 
Vladimir Simakov:
Tudo é válido para o compilador aqui.

Para qual compilador?

 
Vasiliy Sokolov:

Este código me dá o pontapé de saída para o terminal. Na melhor das hipóteses, ele causa um erro crítico na depuração (para animação clique na imagem):


Estranho que tal construção seja ignorada pelo compilador.

A mina compila, funciona corretamente, mas mostra uma mensagem de vazamento de memória (apagar não funciona) após a conclusão.

 
Igor Makanu:

Você vai lhe ensinar o que é ruim agora, é o que é bom que precisa ser tratado ))))

#define private protected

Você não se sentou com os códigos do fxsaber por nada. Parece-me uma obra-prima.

 

Desculpas pela desinformação, escrevi anteriormente que não se pode chamar o método Create() em uma classe infantil.

Agora, duplamente verificado, você pode. Mas o acesso ao membro privado m_button não estava disponível. Ou seja, era impossível verificar, por exemplo, o estado do botão: pressionado/liberado.

Agora, com a dica de Igor, é possível.

#define private protected
#include <Controls\Button.mqh>

class CMyButton : public CButton
{ 
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
}; 

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}
Razão: