Discussione sull’articolo "Usare i Puntatori di Oggetti in MQL5" - pagina 4

 
tol64:
Avete trovato una falla nella sicurezza? )
Sì. È sconsigliabile fare un cast diretto in questo modo. In più c'è dynamic_cast proprio per questo scopo, qui non si può fare un cast completamente corretto ed è una potenziale fonte di errori impliciti e gravi. E in termini di gravità non è molto meglio di puntatori e riferimenti non sicuri.
 
denkir:

Non sarebbe meglio usare il polimorfismo?

Approssimativamente:

Il fatto è che le classi ereditarie CChartObjectRectLabel, CChartObjectButton e CChartObjectEdit hanno i loro metodi unici a cui è necessario accedere. E la classe base CChartObject della libreria standard non ha gli stessi metodi virtuali.

 

Nel mio esempio precedente...

accesso ai metodi delle classi ereditarie?


...risulta così:

//--- oggetti[0]. // Come ottenere l'accesso ai metodi della classe CChartObjectEdit?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- oggetti[1]. // Come accedere ai metodi della classe CChartObjectButton?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- oggetti[2]. // Come accedere ai metodi della classe CChartObjectRectLabel?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
Già. Non è ortodosso lanciare direttamente in questo modo. In plus c'è dynamic_cast proprio per questo scopo, qui non è possibile eseguire il cast in modo completamente corretto ed è una potenziale fonte di errori impliciti e gravi. E per serietà non è molto meglio di puntatori e riferimenti non sicuri.

Sì, prima di porre una domanda qui sul forum, ho trovato in rete che il C++ ha l'operatore dynamic_cast (un meccanismo di identificazione dinamica dei dati).

Ora sto guardando il link qui sopra:

// Il meccanismo di identificazione dinamica dei tipi di dati è disponibile solo per quelli polimorfi. 
// classi (cioè classi che contengono almeno una funzione membro virtuale)

Quindi è una condizione obbligatoria? E se non ci sono metodi virtuali nella classe base, allora dynamic_cast non funzionerà?

P.S. >>> Qui sto leggendo di più su dynamic_cast (MSDN).

 
TheXpert:
Merda, e poi parli di sicurezza del linguaggio?

Probabilmente pensate di poter fare liberamente il cast di qualsiasi cosa come in C/C++.

Non è così e non c'è nulla di sbagliato nella sicurezza.

 
Renat:

Probabilmente si pensa che si possa eseguire il cast su qualsiasi cosa come in C/C++.

Non è così e non c'è nulla di sbagliato nella sicurezza.

Ho avuto questo errore per caso, che sembra confermare le tue parole. )

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

Non è così e non c'è nulla di sbagliato nella sicurezza.

No, normalmente non si può fare un controllo dynamic_cast in fase di compilazione.
 
TheXpert:
No, non è possibile controllare correttamente dynamic_cast in fase di compilazione.

Il commento sopra mostra il risultato del controllo del casting in rantime.

È molto rigido, funziona con il meccanismo RTTI, perché sappiamo esattamente chi è chi in caso di fantasmi.

 
Renat:

Il commento precedente mostra il risultato del controllo del casting in rantime.

Ops.... confuso. Pensavo fosse un compilatore. Poi mi rimangio tutto.
 
Il tutorial mi ha chiarito le idee sul polimorfismo. Grazie