Come sovrascrivere Compare() in CObject in modo che CList sort() funzioni? - pagina 4

 
Ex Ovo Omnia:

Sono solo curioso di sapere perché avete bisogno dell'operatore "&" nellafunzione Compare() per ottenere il valore di "this".


Perché il metodo Compare() è "const", e non è possibile chiamare metodi non "const" al suo interno.

In questo esempio, vedi codice a pagina 2, il metodo getPrice() non è const e al suo interno la funzione CopyClose() non è anch'essa const. Tutti i metodi possono essere convertiti in "const", ma CopyClose() no.

Comunque, l'operatore "&" dà accesso ai metodi non const, quindi, possiamo chiamarli dentro unmetodo "const".

 
Gustavo Hennemann:

Perché il metodo Compare() è "const", e non è possibile chiamare metodi non "const" al suo interno.

In questo esempio, vedi codice a pagina 2, il metodo getPrice() non è const e al suo interno la funzione CopyClose() non è anch'essa const. Tutti i metodi possono essere chiamati "const", ma CopyClose() no.

Comunque, l'operatore "&" dà accesso ai metodi non const, quindi, possiamo chiamarli dentro unmetodo "const".


Ora capisco. Non ho idea se sia una costruzione valida, probabilmente lo sapete. Per me è meglio evitare completamente le dichiarazioni di metodo 'const' in MQL, come in Java.

 
Ex Ovo Omnia:

Ora capisco. Non ho idea se sia una costruzione valida, probabilmente lo sapete. Per me è meglio evitare completamente le dichiarazioni di metodi 'const' in MQL, come in Java.


Per utilizzare i metodi (molto utili) delle classi di raccolta della libreria std (cioè ricerca, ordinamento, ecc.) dovete sovrascrivere il metodo Compare di CObject. Questo significa che tutti i metodi chiamati dall'interno del metodo Compare devono anche essere metodi const. OP non ha aggirato questo dettaglio, OP semplicemente non ha usato correttamente il puntatore'this'. Così invece di chiamare semplicemente this.DoSomething(), OP ha creato il suo proprio puntatore a (self)object. es. otherSelfPointer.DoSomething()

 
nicholishen:

Per utilizzare i metodi (molto utili) delle classi di raccolta della libreria std (es. search, sort, ecc.) dovete sovrascrivere il metodo Compare di CObject. Questo significa che tutti i metodi chiamati dall'interno del metodo Compare devono anche essere metodi const. OP non ha aggirato questo dettaglio, OP semplicemente non ha usato correttamente il puntatore this. Così invece di chiamare this.DoSomething(), OP ha creato il suo proprio puntatore a (self)object invece di usare semplicemente la parola chiave this. es. otherSelfPointer.DoSomething()


Capisco cosa ha fatto, la domanda è ora, se questa costruzione è innocua (in generale). Il compilatore non si aspetta che l'oggetto modifichi i suoi membri nelle funzioni const.

 
Ex Ovo Omnia:

Capisco cosa ha fatto, la domanda è ora, se questa costruzione è innocua (in generale). Il compilatore non si aspetta che l'oggetto modifichi i suoi membri nelle funzioni const.

In questo caso specifico ottengo solo il valore, non sto cambiando nulla. Ma, se proviamo a cambiare un valore const probabilmente il compilatore avvertirà di questo problema, o, nel peggiore dei casi, otterremo un'eccezione di run time.

 
Ex Ovo Omnia:

Capisco cosa ha fatto, la domanda è ora, se questa costruzione è innocua (in generale). Il compilatore non si aspetta che l'oggetto modifichi i suoi membri nelle funzioni const.


Ohhh.... Vedo ora, il mio errore. Questo potrebbe potenzialmente essere pericoloso. OP dovrebbe assicurarsi che tutti i metodi all'interno del perview di Compare() siano anche metodi const.

 
Gustavo Hennemann:

Ciao @Alain Verleyen,

Ho cambiato il metodo getPrice(), invece di usare CopyClose() sto usando CopyBuffer(). Questo non cambia l'obiettivo principale.

Quindi, se utilizzo la parola chiave "const" nel metodo getPrice(), ottengo l'errore: "'CopyBuffer' - nessuno degli overloads può essere applicato alla chiamata di funzione". Penso che questo accada perché CopyBuffer non è un metodo const, e non è possibile chiamare un metodo non const all'interno di un metodo const.

Scusa per la risposta tardiva, ma non ho avuto tempo di seguire l'argomento fino ad ora.

Non ho ancora capito perché non puoi dichiarare il tuo getPrice() come const quando usi CopyBuffer(). Non ha senso per me, potresti postare la tua versione aggiornata di getPrice()?

 

Qualsiasi aggiornamento