¿Cómo anular Compare() en CObject para que funcione CList sort()? - página 4

 
Ex Ovo Omnia:

Sólo tengo curiosidad por saber por qué necesitabas el operador "&" en lafunción Compare() para obtener el valor de "this".


Porque el método Compare() es "const", y no es posible llamar a métodos no "const" dentro de él.

En este ejemplo, ver el código en la página 2, el método getPrice() no es const y dentro de él la función CopyClose() tampoco es const. Todos los métodos pueden ser cambiados a "const", pero CopyClose() no.

De todas formas, el operador "&" da acceso a los métodos no const, por lo que podemos llamarlos dentro de unmétodo "const".

 
Gustavo Hennemann:

Porque el método Compare() es "const", y no es posible llamar a métodos no "const" dentro de él.

En este ejemplo, ver código en la página 2, el método getPrice() no es const y dentro de él la función CopyClose() tampoco es const. Todos los métodos se pueden cambiar a "const", pero CopyClose() no.

De todas formas, el operador "&" da acceso a métodos no const, por lo que podemos llamarlos dentro de unmétodo "const".


Ahora lo veo. No tengo ni idea, si es una construcción válida, probablemente lo sepas. Para mí es mejor evitar completamente las declaraciones de métodos "const" en MQL, como en Java.

 
Ex Ovo Omnia:

Ahora veo. No tengo ni idea, si es una construcción válida, probablemente usted sabe. Para mi es mejor evitar completamente las declaraciones de métodos 'const' en MQL, como en Java.


Para utilizar los métodos (muy útiles) de las clases de colección de la biblioteca std (es decir, buscar, ordenar, etc.) tienes que anular el método Compare de CObject. Esto significa que todos los métodos llamados desde el método Compare también tienen que ser métodos const. OP no ha eludido este detalle, simplemente no ha utilizado el puntero'this' correctamente. Así que en lugar de simplemente llamar a this.DoSomething(), OP creó su propio puntero a (self)object. eg. otherSelfPointer.DoSomething()

 
nicholishen:

Para utilizar los métodos (muy útiles) de las clases de colección de la biblioteca std (es decir, buscar, ordenar, etc.) tienes que anular el método Compare de CObject. Esto significa que todos los métodos llamados desde el método Compare también tienen que ser métodos const. OP no ha eludido este detalle, simplemente no ha utilizado el puntero this correctamente. Así que en lugar de llamar a this.DoSomething(), OP creó su propio puntero a (self)object en lugar de simplemente usar la palabra clave this. eg. otherSelfPointer.DoSomething()


Entiendo lo que hizo, la pregunta es ahora, si esta construcción es inofensiva (en general). El compilador no espera que el objeto modifique sus miembros en funciones const.

 
Ex Ovo Omnia:

Entiendo lo que hizo, la pregunta es ahora, si esta construcción es inofensiva (en general). El compilador no espera que el objeto modifique sus miembros en funciones const.

En este caso concreto solo obtengo el valor, no estoy modificando nada. Pero, si intentamos cambiar un valor const probablemente el compilador alertará sobre este tema, o, en el peor de los casos obtendremos una excepción en tiempo de ejecución.

 
Ex Ovo Omnia:

Entiendo lo que hizo, la pregunta es ahora, si esta construcción es inofensiva (en general). El compilador no espera que el objeto modifique sus miembros en funciones const.


Ohhh.... Ahora veo, mi error. Eso podría ser potencialmente peligroso. OP debería asegurarse de que todos los métodos dentro del ámbito de Compare() sean también métodos const.

 
Gustavo Hennemann:

Hola @Alain Verleyen,

He cambiado el método getPrice(), en lugar de usar CopyClose() estoy usando CopyBuffer(). Esto no cambia el objetivo principal.

Entonces, si utilizo la palabra clave "const" en el método getPrice(), me sale el error "'CopyBuffer' - no se puede aplicar ninguna de las sobrecargas a la llamada de la función". Creo que esto ocurre porque CopyBuffer no es un método const, y no es posible llamar a un método no const dentro de un método const.

Perdona la tardanza en la respuesta, pero no he tenido tiempo de seguir el tema hasta ahora.

Sigo sin ver por qué no puedes declarar tu getPrice() como const cuando usas CopyBuffer(). No tiene sentido para mí, ¿podrías publicar tu versión actualizada de getPrice() ?

 

Cualquier actualización

Razón de la queja: