Comment surcharger Compare() dans CObject pour que CList sort() fonctionne ? - page 4

 
Ex Ovo Omnia:

Je suis simplement curieux de savoir pourquoi vous avez eu besoin de l'opérateur "&" dans lafonction Compare() pour obtenir la valeur de "this".


Parce que la méthode Compare() est "const", et qu'il n'est pas possible d'y appeler des méthodes non "const".

Dans cet exemple, voir le code en page 2, la méthode getPrice() n'est pas const et la fonction CopyClose() n'est pas const non plus. Toutes les méthodes peuvent être changées en "const", mais pas CopyClose().

De toute façon, l'opérateur "&" donne accès aux méthodes non constantes, donc, on peut les appeler à l'intérieur d'uneméthode "const".

 
Gustavo Hennemann:

Parce que la méthode Compare() est "const", et qu'il n'est pas possible d'y appeler des méthodes non "const".

Dans cet exemple, voir le code en page 2, la méthode getPrice() n'est pas const et la fonction CopyClose() n'est pas const non plus. Toutes les méthodes peuvent être changées en "const", mais pas CopyClose().

De toute façon, l'opérateur "&" donne accès aux méthodes non constantes, donc, on peut les appeler à l'intérieur d'uneméthode "const".


Je vois maintenant. Je n'ai aucune idée, si c'est une construction valide, probablement vous savez. Pour moi, il est préférable d'éviter complètement les déclarations de méthodes 'const' en MQL, comme en Java.

 
Ex Ovo Omnia:

Je vois maintenant. Je n'ai aucune idée, si c'est une construction valide, probablement vous le savez. Pour moi, il est préférable d'éviter complètement les déclarations de méthodes 'const' en MQL, comme en Java.


Afin d'utiliser les méthodes (très utiles) des classes de collection de la bibliothèque std (c'est-à-dire recherche, tri, etc.), vous devez surcharger la méthode Compare de CObject. Cela signifie que toutes les méthodes appelées à l'intérieur de la méthode Compare doivent également être des méthodes const. OP n'a pas contourné ce détail, OP n'a simplement pas utilisé le pointeur'this' correctement. Ainsi, au lieu de simplement appeler this.DoSomething(), OP a créé son propre pointeur vers l'objet (self). ex. otherSelfPointer.DoSomething()

 
nicholishen:

Afin d'utiliser les méthodes (très utiles) des classes de collection de la bibliothèque std (c'est-à-dire recherche, tri, etc.), vous devez surcharger la méthode Compare de CObject. Cela signifie que toutes les méthodes appelées par la méthode Compare doivent également être des méthodes const. OP n'a pas contourné ce détail, OP n'a simplement pas utilisé le pointeur this correctement. Ainsi, au lieu d'appeler this.DoSomething(), OP a créé son propre pointeur vers l'objet (self) au lieu d'utiliser simplement le mot clé this. ex. otherSelfPointer.DoSomething()


Je comprends ce qu'il a fait, la question est maintenant de savoir si cette construction est inoffensive (en général). Le compilateur ne s'attend pas à ce que l'objet modifie ses membres dans les fonctions const.

 
Ex Ovo Omnia:

Je comprends ce qu'il a fait, la question est maintenant de savoir si cette construction est inoffensive (en général). Le compilateur ne s'attend pas à ce que l'objet modifie ses membres dans les fonctions const.

Dans ce cas précis, je ne fais que récupérer la valeur, je ne change rien. Mais, si nous essayons de modifier une valeur constante, le compilateur nous alertera probablement sur ce problème, ou, dans le pire des cas, nous obtiendrons une exception d'exécution.

 
Ex Ovo Omnia:

Je comprends ce qu'il a fait, la question est maintenant de savoir si cette construction est inoffensive (en général). Le compilateur ne s'attend pas à ce que l'objet modifie ses membres dans les fonctions const.


Ohhh.... Je vois maintenant, ma faute. Cela pourrait potentiellement être dangereux. L'OP devrait s'assurer que toutes les méthodes dans le champ d'application de Compare() sont également des méthodes constantes.

 
Gustavo Hennemann:

Bonjour @Alain Verleyen,

J'ai modifié la méthode getPrice(), au lieu d'utiliser CopyClose(), j'utilise CopyBuffer(). Cela ne change pas l'objectif principal.

Donc, si j'utilise le mot clé "const" dans la méthode getPrice(), j'obtiens l'erreur : "'CopyBuffer' - aucune des surcharges ne peut être appliquée à l'appel de fonction". Je pense que cela se produit parce que CopyBuffer n'est pas une méthode const, et il n'est pas possible d'appeler une méthode non const à l'intérieur d'une méthode const.

Désolé pour la réponse tardive, mais je n'ai pas eu le temps de suivre le sujet jusqu'à présent.

Je ne vois toujours pas pourquoi vous ne pouviez pas déclarer votre getPrice() comme const lorsque vous utilisez CopyBuffer(). Cela n'a pas de sens pour moi, pouvez-vous poster votre version mise à jour de getPrice() ?

 

Toute mise à jour