Perguntas sobre OOP em MQL5 - página 12

 
Vasiliy Pushkaryov:

Uma palavra de conselho sobre outro assunto. Se você criar uma classe infantil CMyButton a partir do CButton, você pode criar um botão e depois mudar suas propriedades fora da classe. Abaixo, isto é feito no OnInit().

Mas se eu quiser fazer campos adicionais dentro da classe criança e usar as propriedades embutidas da classe CButton em novas funções, como posso fazer isso corretamente?

Na classe CButton, o membro da classe m_button é declarado na seção privada.

Eu não posso entrar na seção privada da classe dos pais.

Talvez pudéssemos mantê-lo simples e direto - veja como o nome do objeto gráfico é formado na classe CButton e trabalhar diretamente com esses objetos gráficos. Quanto mais com um botão, deve ser fácil, ele tem apenas um objeto gráfico.

 
TheXpert:

Sim, duas pessoas sem ligação já estão fotografando uma cruz do seu código )

Seu código não pode funcionar corretamente - é óbvio pelo próprio código).

Duas pessoas? Fora de sua imaginação, hein? Você deve pelo menos ler com mais atenção, ou ao menos olhar as fotos com mais atenção. A primeira mensagem é de um depurador. Ele compila e funciona sem o depurador.

 
Dmitry Fedoseev:

Duas pessoas? De sua fantasia, hein? Você deve ler com mais atenção, ou pelo menos olhar as fotos com mais atenção. A primeira mensagem é de um depurador. Sem depurador, ele compila e funciona.

Consegui que ele caísse sem depurador).

também cai no debugger ))

talvez você simplesmente não saiba onde olhar para o log de saída do roteiro? )))

 
TheXpert:

Estou caindo sem depurador)

Também estou me engradando no debugger).

talvez você simplesmente não saiba onde visualizar o log de saída do roteiro? )))

Não, não sei, diga-me onde está.

 
Vasiliy Pushkaryov:

Uma palavra de conselho sobre outro assunto. Se você criar uma classe infantil CMyButton a partir do CButton, você pode criar um botão e depois mudar suas propriedades fora da classe. Abaixo, isto é feito no OnInit().

Mas se eu quiser fazer campos adicionais dentro da classe criança, e usar as propriedades embutidas da classe CButton em novas funções, como isso pode ser implementado corretamente?

Na classe CButton, o membro da classe m_button é declarado na seção privada.

Acho que você está resolvendo seu problema pelo lado do "rabo" novamente, eu sugeriria resolvê-lo pelo outro lado:

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

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


Dmitry Fedoseev:

Você não pode entrar na seção privada da classe dos pais.

você pode entrar pelo menos com #define e você pode experimentar com dynamic_cast. No ano passado estudei dynamic_cast e ele faz coisas incríveis, mas é um processo demorado


TheXpert:

consegui sem depurador )

verificado - Também recebi: 2019.07.05 17:10:27.307 1 (EURUSD,H1) acesso ponteiro inválido em '1.mq5' (43,6)

 

E você me intrigou, então eu pensei que talvez eu fosse realmente o idiota que você pensa que eu sou. Eu desenterrei um código que escrevi há cinco anos, aqui está um trecho:

Assim, você pode manter... vomite seu... tudo o que você quiser... ...e sonhar que sou um idiota, mas até agora é o contrário. Você está pulando como demônios loucos e isso não adianta.

***

E com esse meu código, apesar do fato de que ele compila e funciona, rapidamente fica claro que há algo errado com ele. O objeto não é apagado via exclusão.

Mas você gosta de acreditar que eu nem sei o que: CObj obj; continue acreditando...

***

Mas eles estão prontos para congelar os ouvidos aos seus calcanhares "para maltratar o seu avô". Até mesmo seu coletor de lixo apareceu na MQL.

 
Dmitry Fedoseev:

Mas você me intrigou, então eu pensei que talvez eu fosse realmente o idiota que você pensa que eu sou. Eu desenterrei um código que escrevi há cinco anos, aqui está um trecho:

Assim, você pode manter... vomite seu... tudo o que você quiser... ...e cano abaixo que eu sou um idiota, mas até agora é o contrário.

Aqui tudo está correto, a referência é a um ponteiro, e o que está causando toda a confusão é uma referência a um objeto que não existe. Veja o código cuidadosamente.
 
Vladimir Simakov:
Tudo está correto aqui, o ponteiro é referido, enquanto que aquele que faz toda a luta é uma referência a um objeto que não existe. Veja o código cuidadosamente.

Você realmente acha que não consigo perceber que existe um * em um lugar e um * & em outro?

E você também acredita que eu não sei o queCObj obj; é?

 
Vladimir Simakov:
...uma referência a um objeto que não existe...

Mas ele compila e funciona.

 
Dmitry Fedoseev:

Você realmente acha que não consigo perceber que existe um * em um lugar e um * & em outro?

E você também acredita que eu não sei o queCObj obj; é?

Você fez.
void z(CObj & o){
   o = new CObj();
}
Razão: