Como substituir a comparação() em CObject para que a classificação CList() funcione? - página 4

 
Ex Ovo Omnia:

Estou apenas curioso por que você precisava do operador "&" nafunção Comparar() para obter o valor de "isto".


Porque o método Compare() é "const", e não é possível chamar métodos que não sejam "const" dentro dele.

Neste exemplo, veja código na página 2, o método getPrice() não é const e dentro dele a função CopyClose() também não é const. Todos os métodos podem ser classificados como "const", mas CopyClose() não é const.

De qualquer forma, o operador "&" dá acesso aos métodos não constantes, portanto, podemos chamá-los dentro de ummétodo "const".

 
Gustavo Hennemann:

Porque o método Compare() é "const", e não é possível chamar métodos não const dentro dele.

Neste exemplo, veja código na página 2, o método getPrice() não é const e dentro dele a função CopyClose() também não é const. Todos os métodos podem ser classificados como "const", mas CopyClose() não é const.

De qualquer forma, o operador "&" dá acesso a métodos não constantes, portanto, podemos chamá-los dentro de ummétodo "const".


Agora eu vejo. Não tenho idéia, se é uma construção válida, provavelmente você sabe. Para mim, é melhor evitar completamente declarações do método "const" em MQL, como em Java.

 
Ex Ovo Omnia:

Estou vendo agora. Não tenho idéia, se é uma construção válida, provavelmente você sabe. Para mim, é melhor evitar declarações do método 'const' completamente em MQL, como em Java.


A fim de utilizar os métodos (muito úteis) das classes de coleção da biblioteca std (ou seja, busca, classificação, etc.) você tem que substituir o método de comparação de CObject. Isto significa que todos os métodos chamados de dentro do método Comparar também têm que ser métodos constantes. OP não contornou este detalhe, OP apenas não usou o ponteiro"isto" corretamente. Assim, ao invés de simplesmente chamar isto.DoSomething(), OP criou seu próprio ponteiro para (auto)objeto. ex. otherSelfPointer.DoSomething()

 
nicholishen:

A fim de utilizar os métodos (muito úteis) das classes de coleção da biblioteca std (isto é, busca, classificação, etc.) você tem que substituir o método de comparação de CObject. Isto significa que todos os métodos chamados de dentro do método Comparar também têm que ser métodos constantes. OP não contornou este detalhe, OP apenas não usou este ponteiro corretamente. Assim, em vez de chamar isto.DoSomething(), OP criou seu próprio ponteiro para (auto)objeto em vez de simplesmente usar esta palavra-chave, por exemplo, otherSelfPointer.DoSomething()


Entendo o que ele fez, a questão agora é, se esta construção é inofensiva (em geral). O compilador não espera que o objeto modifique seus membros em funções constantes.

 
Ex Ovo Omnia:

Entendo o que ele fez, a questão agora é, se esta construção é inofensiva (em geral). O compilador não espera que o objeto modifique seus membros em funções constantes.

Neste caso específico eu só estou recebendo o valor, não estou mudando nada. Mas, se tentarmos mudar um valor const provavelmente o compilador alertará sobre este problema, ou, no pior dos casos, teremos uma exceção de tempo de execução.

 
Ex Ovo Omnia:

Entendo o que ele fez, a questão agora é, se esta construção é inofensiva (em geral). O compilador não espera que o objeto modifique seus membros em funções constantes.


Ohhh.... Vejo agora, meu erro. Isso pode ser potencialmente perigoso. OP deve certificar-se de que todos os métodos dentro da visão de comparação() também são métodos constantes.

 
Gustavo Hennemann:

Oi @Alain Verleyen,

Eu alterei o método getPrice(), inseri usando CopyClose() Eu estou usando CopyBuffer(). Isto não muda o objetivo principal.

Portanto, se eu usar a palavra-chave "const" no método getPrice(), um erro getPrice(): "'CopyBuffer' - nenhuma das sobrecargas pode ser aplicada à chamada de função". Acho que isto ocorre porque CopyBuffer não é um método const, e não é possível chamar o método non const dentro de um método const.

Desculpe pela resposta tardia, mas não tive tempo de acompanhar o assunto até agora.

Ainda não vejo porque você não pôde declarar seu getPrice() como constante ao usar CopyBuffer(). Não faz sentido para mim, você poderia postar sua versão atualizada de getPrice()?

 

Qualquer atualização