Non riesco ancora a capire i puntatori e i riferimenti in MQL5 e ora in MQL4. Qual è la differenza tra passaggio per riferimento e puntatore, a parte il codice extra? C'è una differenza in C++, ma qual è qui? Se non è difficile scrivere in modo più dettagliato.
Il passaggio per riferimento richiede che l'oggetto passato per riferimento sia inizializzato. Il passaggio per puntatore non ha questa restrizione:
Quando si chiama la funzione TestShapeRef, il codice si blocca perché la forma non è inizializzata. D'altra parte, all'interno della funzione TestShapePointer, sono necessari controlli costanti per verificare se l'oggetto passato è inizializzato o meno. Pertanto, si deve seguire la regola dell'imprimatur:
Se l'oggetto deve essere garantito come esistente nel momento in cui viene passato alla funzione, utilizzare un passaggio "&". Se la funzione richiede un oggetto il cui stato è indefinito, utilizzare il passaggio con il puntatore "*" e all'interno di questa funzione controllare la validità del puntatore passato.
C'è un'altra sottile sfumatura da tenere a mente. Considerate l'esempio precedente:
Questo programma funzionerà correttamente? No, terminerà con l'errore "accesso al puntatore non valido" alla riga printf(shape.name); //ERRORE (!?) , nonostante il fatto che sembra garantita la creazione di un oggetto nella funzione TestShapePointer. Il punto è che in realtà è stato passato un riferimento NULL al posto della forma. Cioè, la forma all'interno della funzione e quella passata sono oggetti diversi! Pertanto, dopo l'uscita dalla funzione, shape è ancora uguale a NULL e il puntatore a shape all'interno della funzione è perso (cancellato nello stack). Quindi.
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CFoo
{
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CBar : public CFoo
{
public:
void func(int x) { Print("Hello from Bar ",x); }
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void func(CFoo *foo)
{
//--- chiamata con casting direttamente dal puntatore al tipo base
((CBar*)foo).func(1);
//--- chiamata con conversione al tipo di destinazione e salvataggio di una copia del puntatore con il tipo richiesto
CBar *b=(CBar *)foo;
b.func(2);
//--- eliminare la classe creata dinamicamentedelete foo;
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnStart()
{
func(new CBar);
}
//+------------------------------------------------------------------+
Non riesco ancora a capire i puntatori e i riferimenti in MQL5 e ora in MQL4. Qual è la differenza tra passaggio per riferimento e puntatore, a parte il codice extra? C'è una differenza in C++, ma qual è qui? Se non è difficile scrivere in modo più dettagliato.
Il passaggio per riferimento richiede che l'oggetto passato per riferimento sia inizializzato. Il passaggio per puntatore non ha questa restrizione:
Quando si chiama la funzione TestShapeRef, il codice si blocca perché la forma non è inizializzata. D'altra parte, all'interno della funzione TestShapePointer, sono necessari controlli costanti per verificare se l'oggetto passato è inizializzato o meno. Pertanto, si deve seguire la regola dell'imprimatur:
C'è un'altra sottile sfumatura da tenere a mente. Considerate l'esempio precedente:
Questo programma funzionerà correttamente? No, terminerà con l'errore "accesso al puntatore non valido" alla riga printf(shape.name); //ERRORE (!?) , nonostante il fatto che sembra garantita la creazione di un oggetto nella funzione TestShapePointer. Il punto è che in realtà è stato passato un riferimento NULL al posto della forma. Cioè, la forma all'interno della funzione e quella passata sono oggetti diversi! Pertanto, dopo l'uscita dalla funzione, shape è ancora uguale a NULL e il puntatore a shape all'interno della funzione è perso (cancellato nello stack). Quindi.È possibile creare un array con oggetti di tipo diverso?
Prendiamo questo esempio:
//---
Come ottenere l'accesso ai metodi delle classi ereditate?
Come accedere ai metodi delle classi ereditarie?
Hai provato a lanciare un tipo di bersaglio?
No. È la prima volta che ne sento parlare. Dove posso leggere qualcosa al riguardo?
La solita conversione di tipo, ecco un esempio:
Hai provato a fare il casting sul tipo di destinazione?
Merda, e dopo parli di sicurezza del linguaggio?
Non sarebbe meglio usare il polimorfismo?
Funziona più o meno così: