Domande su OOP in MQL5 - pagina 41

 
Igor Makanu:

ho guardato i risultati della mia battaglia con il codice in stile OOP - hmmm... eccellente! ))))


Ho una domanda, ma nel mio codice, beh, tre volte esattamente, uso una costruzione come:

chiama tutti in metodi privati, ma c'è un "metodo Jedi ?" per allontanarsi nel codice sorgente da CheckPointer(m_order)==POINTER_INVALID

Sto chiedendo un po' di get / set

nessun problema speciale, ma per così dire un capriccio, o mentre la sete di conoscenza dei metodi OOP in C++ non si è ancora placata

Se la domanda è "molte lettere", allora !CheckPointer(mPtr), e se la funzione chiama, si inizializzano tutti i puntatori a NULL nel costruttore e si confrontano con esso nel codice, senza dimenticare quando si cancella ptr; ptr=NULL;

 
Igor Makanu:

guardato i risultati della mia battaglia con il codice in stile OOP - hmmm... eccellente! ))))


Ho una domanda, ma nel mio codice, beh, tre volte esattamente, uso una costruzione come:

chiama tutti in metodi privati, ma c'è un "metodo Jedi ?" per allontanarsi nel codice sorgente da CheckPointer(m_order)==POINTER_INVALID

Sto chiedendo un po' di get / set

nessun problema particolare, ma per così dire un capriccio, o mentre la sete di conoscenza dei metodi OOP in C++ non si è ancora placata


Igor, guarda questo esempio, penso che sia quello che stai chiedendo.

 
Vladimir Simakov:

Se la domanda è "molte lettere", allora !CheckPointer(mPtr), e se in una chiamata di funzione, inizializzate tutti i puntatori a NULL nel costruttore e confrontate con esso nel codice, senza dimenticare quando cancellate ptr; ptr=NULL;

Bene e questo, per lo zucchero:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

Nessun problema particolare, ma per così dire un capriccio, o mentre la sete di imparare metodi OOP in C++ non si è ancora spenta.

Raccomando vivamente di inizializzare tutti i campi della classe con valori predefiniti nel costruttore. Il punto è che se volete fare questo:

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

nessuno inizializzerà i campi della vostra classe e ci saranno valori spazzatura.

 
Vladimir Simakov:

E questo, per lo zucchero:

No, ho quasi rinunciato alle definizioni, semplicemente non voglio avvolgere nulla, come ho scritto un paio di settimane fa - voglio vedere il puro codice in stile OOP per ora, valutare la flessibilità e le possibilità

HH: ho appena avvolto i discendenti in define alla creazione, per non scrivere la stessa inizializzazione su 3 righe, è più facile aggiungere metodi in seguito, cioè nel codice sorgente su una riga finora

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
Romano:


Igor, dai un'occhiata a questo esempio, penso che sia quello che stai chiedendo.

no, intendo l'equivalente in c# - operatore ?? (operatore null-join), qualcosa di simile nella logica che voglio vedere in stile C++


UPD:

Vladimir Simakov:

Raccomando vivamente di inizializzare tutti i campi di una classe con valori predefiniti nel costruttore. Il punto è che se volete fare questo:

Se stai chiedendo una macro, nessuno inizializzerà i campi della tua classe e ci saranno valori spazzatura.

questo è quello che ho fatto, costruttore con inizializzazione di qualsiasi cosa e tutto nella classe base, i discendenti inizializzano la classe base:

è quello che ho avvolto in una macro, in modo da non dimenticare di inizializzare correttamente ))))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

No, ho quasi rinunciato alle definizioni, semplicemente non voglio avvolgere nulla, come ho scritto un paio di settimane fa - voglio vedere il puro codice in stile OOP per ora, valutare la flessibilità e le possibilità

ZS: solo discendenti avvolti in define alla creazione, per non scrivere la stessa inizializzazione su 3 righe, è più facile aggiungere metodi in seguito, cioè nel codice sorgente su una riga per ora

no, intendo l'equivalente in c# - operatore ?? (operatore null-join), voglio vedere qualcosa di simile nella logica in stile C++

Il preprocessore è una perdita di tempo. Insieme ai modelli, sono gli strumenti più forti. Non sembra esserci un analogo dell'operatore ?? Il C++ è più duro da questo punto di vista.
 
Vladimir Simakov:
Il tuo rifiuto del preprocessore è vano. Insieme ai modelli sono gli strumenti più potenti. Non sembra esserci un analogo dell'operatore ?? Il C++ è più duro da questo punto di vista.

Sono ancora in una battaglia per lo stile OOP puro, voglio imparare tutte le tecniche OOP, mentre c'è una risorsa sul forum ;)

Sono al passo con il preprocessore, ma ... Penso che non dovrei abusarne, almeno, non nel mio stile, potrei sbagliare, e certamente non sarò in grado di leggere il codice con macrosostituzioni multiple, e come cercare i bug... beh, è più facile riscrivere - quindi, non ancora necessario


modelli... Beh, non mi piace quello che gli sviluppatori offrono in SB, li ho guardati tutti, è difficile dire per quale scopo sono stati inclusi in SB, forse non è ancora arrivato il loro momento

riguardo al porting dei template C++ a MQL - è tempo, come la discussione ha mostrato, che nella maggior parte dei casi i template C++ richiedono una messa a punto per MQL - è più facile tornare a .dll e non disturbare MQL ))))

 
Igor Makanu:

Sono ancora in una battaglia per lo stile OOP puro, voglio imparare tutte le tecniche OOP, mentre c'è una risorsa sul forum ;)

Sono al passo con il preprocessore, ma ... Penso che non dovrei abusarne, almeno, non nel mio stile, potrei sbagliare, e certamente non sarò in grado di leggere il codice con macrosostituzioni multiple, e come cercare i bug... beh, è più facile riscrivere - quindi, non ancora necessario


modelli... Beh, non mi piace quello che gli sviluppatori offrono in SB, li ho guardati tutti, è difficile dire per quale scopo sono stati inclusi in SB, forse non è ancora arrivato il loro momento

riguardo al porting dei template C++ a MQL - è tempo, come la discussione ha mostrato, che nella maggior parte dei casi i template C++ richiedono una messa a punto per MQL - è più facile tornare a .dll e non disturbare MQL ))))

Puoi scrivere i tuoi modelli in questo modo)).
 
Vladimir Simakov:
Puoi scrivere i template in questo modo da solo.)))

Sì ))))

Ho finito di leggere l'aiuto e ho saltato l'override, grazie al cielo tutto è in macro, le modifiche, beh, esattamente in un copia-incolla

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD:

no, è uscito per il controllo del permesso stesso, non c'è bisogno di un metodo pubblico!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

E poi c'è questo, per lo zucchero:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

Volevo scrivere quello che avevo prima invece di

if( CheckPointer(m_order)==POINTER_INVALID )

era così:

if(m_order==NULL)

ma ha ricordato come controllare le sostituzioni macro in MQL

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


e se la memoria non m'inganna, all'inizio dell'anno era possibile disimpegnare NULL nel registro e ottenere 0, ora appare un errore

Cioè il comportamento NULL come se non dovrebbe cambiare in futuro, ma cosa viene sostituito lì al posto di NULL non è chiaro, probabilmente se questa situazione viene controllata ora, come scrittoif(CheckPointer(m_order)==POINTER_INVALID)) ) è così per dire il codice corretto))

Motivazione: