Preguntas sobre POO en MQL5 - página 12

 
Vasiliy Pushkaryov:

Un consejo sobre otra cuestión. Si creas una clase hija CMyButton a partir de CButton, puedes crear un botón y luego cambiar sus propiedades fuera de la clase. A continuación esto se hace en OnInit().

Pero si quiero hacer campos adicionales dentro de la clase hija y utilizar las propiedades incorporadas de la clase CButton en nuevas funciones, ¿cómo puedo hacerlo correctamente?

En la clase CButton, el miembro de la clase m_button se declara en la sección privada.

No puedo entrar en la sección privada de la clase padre.

Tal vez podríamos mantenerlo simple y directo - mirar cómo se forma el nombre del objeto gráfico en la clase CButton y trabajar directamente con esos objetos gráficos. El tema del botón es que debería ser fácil, sólo tiene un objeto gráfico.

 
TheXpert:

Sip, ya dos personas desconectadas están photoshopeando una cruz de su código )

Su código no puede funcionar correctamente - es obvio desde el propio código).

¿Dos personas? Fuera de tu imaginación, ¿eh? Al menos deberías leer con más atención, o al menos mirar las fotos con más cuidado. El primer mensaje es de un depurador. Compila y funciona sin el depurador.

 
Dmitry Fedoseev:

¿Dos personas? De tu fantasía, ¿eh? Deberías leer con más atención, o al menos mirar las fotos con más cuidado. El primer mensaje es de un depurador. Sin depurador compila y funciona.

Tengo que hacer que se cuelgue sin depurador).

también se bloquea en el depurador ))

¿tal vez no sabes dónde mirar el registro de salida del script? )))

 
TheXpert:

Me estoy estrellando sin depurador)

Yo también cresteo en el depurador).

¿tal vez no sabes dónde ver el registro de salida del script? )))

No, no lo sé, dime dónde está.

 
Vasiliy Pushkaryov:

Un consejo sobre otra cuestión. Si creas una clase hija CMyButton a partir de CButton, puedes crear un botón y luego cambiar sus propiedades fuera de la clase. A continuación esto se hace en OnInit().

Pero si quiero hacer campos adicionales dentro de la subclase, y utilizar las propiedades incorporadas de la clase CButton en nuevas funciones, ¿cómo se puede implementar esto correctamente?

En la clase CButton el miembro de la clase m_button se declara en la sección privada.

Creo que estás resolviendo tu problema desde el lado de la "cola" de nuevo, yo sugeriría resolverlo desde el otro 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:

No se puede entrar en la sección privada de la clase padre.

puedes entrar al menos con #define y puedes experimentar con dynamic_cast. El año pasado estudié dynamic_cast y hace cosas increíbles, pero es un proceso que consume tiempo


TheXpert:

lo he conseguido sin depurador )

comprobado - También tengo: 2019.07.05 17:10:27.307 1 (EURUSD,H1) acceso de puntero no válido en '1.mq5' (43,6)

 

Y me has intrigado, así que he pensado que tal vez sea realmente el idiota que crees que soy. He desenterrado un código que escribí hace cinco años, aquí hay un fragmento:

Así que, puedes mantener... vomita tu... todo lo que quieras... ...y soñar que soy un idiota, pero hasta ahora es al revés. Estáis saltando como diablos locos y no sirve de nada.

***

Y con ese código mío, a pesar de que se compila y funciona, rápidamente queda claro que hay algo que no funciona. El objeto no se borra mediante la eliminación.

Pero te gusta creer que no sé ni qué: CObj obj; sigue creyendo...

***

Pero están dispuestos a congelar las orejas hasta los talones "para fastidiar a su abuelo". Incluso su recolector de basura apareció en MQL.

 
Dmitry Fedoseev:

Pero me has intrigado, así que he pensado que tal vez sea realmente el idiota que crees que soy. He desenterrado un código que escribí hace cinco años, aquí hay un fragmento:

Así que, puedes mantener... vomita tu... todo lo que quieras... ...y que me digan que soy un idiota, pero hasta ahora es al revés.

Aquí todo es correcto, la referencia es a un puntero, y la que está causando todo el lío es una referencia a un objeto que no existe. Revisa el código con atención.
 
Vladimir Simakov:
Todo es correcto aquí, el puntero es referido, mientras que el que hace toda la pelea es una referencia a un objeto que no existe. Revisa el código con atención.

¿Realmente crees que no puedo notar que hay un * en un lugar y un * & en otro?

¿Y también crees que no sé lo que esCObj obj;?

 
Vladimir Simakov:
...una referencia a un objeto que no existe...

Pero se compila y funciona.

 
Dmitry Fedoseev:

¿Realmente crees que no puedo notar que hay un * en un lugar y un * & en otro?

¿Y también crees que no sé lo que esCObj obj;?

Lo hiciste.
void z(CObj & o){
   o = new CObj();
}
Razón de la queja: