Domande su OOP in MQL5 - pagina 12

 
Vasiliy Pushkaryov:

Un consiglio su un'altra questione. Se create una classe figlia CMyButton da CButton, potete creare un pulsante e poi cambiare le sue proprietà al di fuori della classe. Di seguito questo viene fatto in OnInit().

Ma se voglio fare campi aggiuntivi all'interno della classe figlio e usare le proprietà incorporate della classe CButton in nuove funzioni, come posso farlo correttamente?

Nella classe CButton, il membro di classe m_button è dichiarato nella sezione privata.

Non riesco a entrare nella sezione privata della classe madre.

Forse potremmo mantenerlo semplice e diretto - guardare come il nome dell'oggetto grafico è formato nella classe CButton e lavorare direttamente con quegli oggetti grafici. Tanto più con un pulsante, dovrebbe essere facile, ha solo un oggetto grafico.

 
TheXpert:

Sì, già due persone scollegate stanno photoshoppando una croce del tuo codice)

Il tuo codice non può funzionare correttamente - è ovvio dal codice stesso).

Due persone? Fuori dalla tua immaginazione, eh? Dovresti almeno leggere più attentamente, o almeno guardare le immagini con più attenzione. Il messaggio del primo è di un debugger. Compila e funziona senza il debugger.

 
Dmitry Fedoseev:

Due persone? Dalla tua fantasia, eh? Dovresti leggere più attentamente, o almeno guardare le immagini con più attenzione. Il primo messaggio viene da un debugger. Senza debugger compila e funziona.

Ho avuto un crash senza debugger).

si blocca anche nel debugger ))

forse non sai dove guardare l'output log dello script? )))

 
TheXpert:

Sto andando in crash senza debugger)

Sto facendo la cresta anche nel debugger).

forse non sai dove visualizzare l'output log dello script? )))

No, non lo so, dimmi dov'è.

 
Vasiliy Pushkaryov:

Un consiglio su un'altra questione. Se create una classe figlia CMyButton da CButton, potete creare un pulsante e poi cambiare le sue proprietà al di fuori della classe. Di seguito questo viene fatto in OnInit().

Ma se voglio fare campi aggiuntivi all'interno della classe figlio, e usare le proprietà incorporate della classe CButton in nuove funzioni, come può essere implementato correttamente?

Nella classe CButton il membro di classe m_button è dichiarato nella sezione privata.

Penso che stai risolvendo di nuovo il tuo problema dalla parte della "coda", ti suggerirei di risolverlo dall'altra parte:

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:

Non potete entrare nella sezione privata della classe madre.

si può entrare almeno con #define e si può sperimentare con dynamic_cast. l'anno scorso ho studiato dynamic_cast e fa cose incredibili, ma è un processo che richiede tempo


TheXpert:

L'ho ottenuto senza debugger)

controllato - ho anche ottenuto: 2019.07.05 17:10:27.307 1 (EURUSD,H1) accesso puntatore non valido in '1.mq5' (43,6)

 

Ma lei mi ha incuriosito, così ho pensato che forse sono davvero l'idiota che lei pensa che io sia. Ho ripescato del codice che ho scritto cinque anni fa, ecco uno snippet:

Quindi, puoi tenere... sputare il tuo... tutto quello che vuoi... ...e sognare che sono un idiota, ma finora è il contrario. State saltando come diavoli impazziti ed è inutile.

***

E con quel mio codice, nonostante il fatto che compili e funzioni, diventa subito chiaro che c'è qualcosa che non va. L'oggetto non viene cancellato tramite delete.

Ma a voi piace credere che io non sappia nemmeno cosa: CObj obj; continuate a credere...

***

Ma sono pronti a congelarsi le orecchie fino ai talloni "per fare un dispetto al nonno". Anche il loro raccoglitore di rifiuti è apparso in MQL.

 
Dmitry Fedoseev:

E tu mi hai incuriosito, così ho pensato che forse sono davvero l'idiota che tu pensi che io sia. Ho ripescato del codice che ho scritto cinque anni fa, ecco uno snippet:

Quindi, puoi tenere... sputare il tuo... tutto quello che vuoi... ...e pipa giù che sono un idiota, ma finora è il contrario.

Qui tutto è corretto, il riferimento è a un puntatore, e quello che sta causando tutto il casino è un riferimento a un oggetto che non esiste. Guardate attentamente il codice.
 
Vladimir Simakov:
Qui tutto è corretto, il puntatore è riferito, mentre quello che fa tutta la lotta è un riferimento a un oggetto che non esiste. Guardate attentamente il codice.

Pensi davvero che non possa notare che c'è un * in un posto e un * & in un altro?

E credete anche che io non sappia cosa siaCObj obj;?

 
Vladimir Simakov:
...un riferimento a un oggetto che non esiste...

Ma si compila e funziona.

 
Dmitry Fedoseev:

Pensi davvero che non possa notare che c'è un * in un posto e un * & in un altro?

E credete anche che io non sappia cosa siaCObj obj;?

L'hai fatto.
void z(CObj & o){
   o = new CObj();
}
Motivazione: