Il codice sorgente nel testo dovrebbe essere allineato ai file allegati, in particolare nel listato GetCriticalError_Unsafe.mq5 si fa riferimento alla variabile inesistente status invece di pstatus (come nel file).
E che senso ha definire il proprio tipo di variabile in ciascuna delle classi eredi di CShape?
Vorrei anche ricevere spiegazioni su questo punto. Quando si è passati dall'esempio GetCriticalError_OnDemand a GetCriticalError_Unsafe, l'intero cambiamento si è praticamente ridotto al cambio del tipo di argomento della funzione da CHello *pobject a CHello &pobject. Allo stesso tempo, la chiamata alla funzione rimaneva invariata: vi veniva passato un puntatore (CHello *). In questo caso, secondo le parole dell'autore,"si ottiene nuovamente un errore critico". Il punto è che se un oggetto viene passato per riferimento, l'errore critico si verifica nella fase di chiamata di una funzione in cui viene passato un oggetto non inizializzato". Ma in questo caso è un puntatore e non un riferimento a essere passato alla funzione. La domanda che sorge spontanea è da dove proviene. Potreste spiegare le regole utilizzate da MQL5 per la conversione implicita dei puntatori in riferimenti e viceversa? Oppure indicare il punto della documentazione in cui è descritta. Se il compilatore supportasse la tipizzazione rigorosa, l'esempio fallirebbe semplicemente la compilazione a causa della mancanza di una funzione con un argomento del tipo richiesto.
Il codice sorgente nel testo dovrebbe essere allineato ai file allegati, in particolare nel listato GetCriticalError_Unsafe.mq5 si fa riferimento a una variabile inesistente status invece di pstatus (come nel file).
Grazie, corretto nell'articolo e nel file.
Che senso ha definire una propria variabile di tipo in ciascuna delle classi di CShape che succedono?
Vorrei anche ricevere alcuni chiarimenti su questo argomento. Quando si è passati dall'esempio GetCriticalError_OnDemand a GetCriticalError_Unsafe, l'intero cambiamento si è praticamente ridotto al cambio del tipo di argomento della funzione da CHello *pobject a CHello &pobject. Allo stesso tempo, la chiamata alla funzione rimaneva invariata: vi veniva passato un puntatore (CHello *). In questo caso, secondo le parole dell'autore,"si ottiene nuovamente un errore critico". Il punto è che se un oggetto viene passato per riferimento, l'errore critico si verifica nella fase di chiamata di una funzione in cui viene passato un oggetto non inizializzato". Ma in questo caso, alla funzione viene passato un puntatore, non un riferimento. La domanda che sorge spontanea è da dove deriva. Potreste spiegare le regole utilizzate da MQL5 per la conversione implicita dei puntatori in riferimenti e viceversa? Oppure indicare il punto della documentazione in cui è descritta. Se il compilatore supportasse la tipizzazione rigorosa, l'esempio non verrebbe compilato perché non esiste una funzione con un argomento del tipo richiesto.
In linea di principio, questo membro non viene utilizzato da nessuna parte, è possibile rimuoverlo. In teoria, può essere utilizzato nei discendenti per implementare funzioni che dipendono dal tipo di oggetto.
Se viene definita esplicitamente una funzione che accetta un parametro come puntatore, verrà utilizzata. Se non esiste una funzione di questo tipo, il puntatore dell'oggetto verrà automaticamente trasformato in un riferimento all'oggetto e verrà utilizzata la funzione che accetta l'oggetto come riferimento.
C'è un posto dove posso leggere la direzione delle conversioni implicite eseguite su riferimenti e puntatori? In particolare, viene effettuata anche la conversione inversa, da un riferimento a un puntatore?

- www.mql5.com
Ho capito bene che secondo l'attuale sorgente dell'esempio si ottiene un "rastrellamento" che nell'oggetto di una forma di un particolare tipo ci sono due variabili di tipo, per esempio, CLine::type oltre a CShape::type? Idealmente dovrebbe essercene una sola, proveniente dalla classe base.
Sì, hai ragione. Ci sono due variabili di tipo in ogni discendente, come avete scritto. È successo così perché il codice dei discendenti è stato copiato. Per rendere un membro della classe base disponibile direttamente ai discendenti, occorre definirlo con lo specificatore protected o dichiarare nella classe base i metodi pubblici get e set per questo membro.
Ad esempio, in questo modo:
//+------------------------------------------------------------------+ //|demo_ereditarietà.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | | //|http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ class CBase { private: int type; public: CBase(){type=0;} int GetType(){return(type);} }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ class CSon: CBase { private: int type; public: CSon(){type=2;} void PrintType(); }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void CSon::PrintType() { Print("CSon.type =",type); Print("CBase.type =",CBase::GetType()); } //+------------------------------------------------------------------+ //| Funzione di avvio del programma di script| //+------------------------------------------------------------------+ void OnStart() { //--- CSon son; son.PrintType(); int father_type=son.GetType(); } //+------------------------------------------------------------------+
"Questo esempio è molto semplice, non è difficile trovarvi un errore. Ma se il vostro programma mql5 contiene centinaia o addirittura migliaia di righe, individuare tali errori può diventare molto più complicato. Soprattutto nei casi in cui le condizioni di anomalia nel comportamento del programma dipendono da fattori imprevedibili - ad esempio, da un certo mercato."
Come?:-)

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il nuovo articolo Usare i Puntatori di Oggetti in MQL5 è stato pubblicato:
Di default, tutti gli oggetti in MQL5 vengono passati per riferimento, ma esiste la possibilità di utilizzare i puntatori agli oggetti. Tuttavia è necessario eseguire il controllo del puntatore, poiché l'oggetto potrebbe non essere inizializzato. In questo caso, il programma MQL5 verrà terminato con errore critico e scaricato. Gli oggetti, creati automaticamente, non causano tale errore, quindi in questo senso sono abbastanza sicuri. In questo articolo, cercheremo di comprendere la differenza tra il riferimento all'oggetto e il puntatore all'oggetto e considereremo come scrivere il codice sicuro, che utilizzi i puntatori.
In MQL5, puoi creare la tua classe per l'ulteriore utilizzo delle variabili del tipo di classe nel tuo codice. Come già sappiamo dall'articolo L’Ordine della Creazione dell’Oggetto e della Distruzione in MQL5, le strutture e le classi possono essere create in due modi: automaticamente e dinamicamente.
Per creare un oggetto automaticamente, è sufficiente dichiarare una variabile di tipo classe: il sistema la creerà e la inizializzerà automaticamente. Per creare un oggetto in modo dinamico è necessario applicare esplicitamente l'operatore new al puntatore dell'oggetto.
Tuttavia, qual è la differenza tra gli oggetti creati automaticamente e dinamicamente e quando è necessario l'uso obbligatorio del puntatore all'oggetto e quando è sufficiente creare gli oggetti automaticamente? Questo argomento è l'oggetto di questo articolo. Innanzitutto, discutiamo alcune possibili insidie quando si lavora con gli oggetti e consideriamo i metodi per risolverli.
Autore: MetaQuotes