Amir Yacoby: Você está errado aqui, whroeder1. Não adicionar virtual na base fará você perder o polimorfismo - o método será chamado estaticamente e não dinamicamente em tempo de execução.
Esta foi a ressalva que o whroeder1 mencionou.
whroeder1:
Não adicionar o virtual é má prática, mas não é necessário(exceto no CObject.)
Não adicionar o virtual não muda nada, ele ainda pode ser anulado em uma classe derivada.
Além disso, isto está errado - há uma palavra-chave 'final' na MQL5.
Há também uma palavra-chave final na MQL4, embora a documentação não a mostre (que eu saiba). Possivelmente ela foi mencionada em uma atualização de compilação.
Não está claro o que significa exceto em CObject, mas de qualquer forma, os pontos 1-2 são enganosos: 1. Não é apenas uma má prática, mas exigida em todas as bases (não apenas em CObject) se o polimorfismo for exigido. 2. Ele muda as coisas - ver 1. 3. final existe.
honest_knave: Há também uma palavra-chave final na MQL4, embora a documentação não a mostre (que eu saiba). Possivelmente ela foi mencionada em uma atualização de compilação.
Estou trabalhando em uma classe exatamente como este posto, mas minha variável "pontuação" é um método. Como obter seu valor?
Este é o código desde o início do post:
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+class PriceScore : public CObject
{
protected:
int price;
int score;
public:
PriceScore(void){}
PriceScore(int p, int s):price(p),score(s){}
~PriceScore(void){}
int Compare(const CObject *node,constint mode=0);
void Price(constint p){price = p;}
int Price() const {return price;}
void Score(constint s){score = s;}
int Score() const {return score;}
};
int PriceScore::Compare(const CObject *node,constint mode=0) //Can't call this override from CList
{
PriceScore *pc = (PriceScore*)node;
Print(__FUNCTION__,":Compare called. Incoming: ",pc.Score()," This: ", score); //Doesn't log because this isn't called from CObject'if(pc.Score()< score)return1;
elseif(pc.Score()> score) return -1;
elsereturn0;
}
Isto é o que estou tentando fazer:
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+class PriceScore : public CObject
{
protected:
int price;
int score;
public:
PriceScore(void){}
PriceScore(int p, int s):price(p),score(s){}
~PriceScore(void){}
virtualint Compare(const CObject *node,constint mode=0) override const;
void setPrice(constint p){price = p;}
//this is a simple function to get the close price of todaydouble getPrice()
{
double arrayPrice[1];
CopyClose(mySymbol, myTimeFrame, today, 1, arrayPrice);
return arrayPrice[0];
}
void Score(constint s){score = s;}
int Score() const {return score;}
};
int PriceScore::Compare(const CObject *node,constint mode=0) const
{
PriceScore *pc = (PriceScore*)node;
Print(__FUNCTION__,":Compare called. Incoming: ",pc.Score()," This: ", score);
if(pc.Score() < getPrice()) //here is the problem, how to use getPrice()???return1;
elseif(pc.Score() > getPrice()) //here is the problem, how to use getPrice()???return -1;
elsereturn0;
}
A questão é, como usar getPrice() dentro do método Comparar()?
Mudei o método getPrice(), inseri usando CopyClose() 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.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Além disso, isto está errado - há uma palavra-chave 'final' na MQL5.
{
//--- class body
};
class CBar : public CFoo
{
//--- class body
};
isto não deixará a CBar compilar porque o CFoo é final.
Você está errado aqui, whroeder1.
Não adicionar virtual na base fará você perder o polimorfismo - o método será chamado estaticamente e não dinamicamente em tempo de execução.
Esta foi a ressalva que o whroeder1 mencionou.
Além disso, isto está errado - há uma palavra-chave 'final' na MQL5.
1. Não é apenas uma má prática, mas exigida em todas as bases (não apenas em CObject) se o polimorfismo for exigido.
2. Ele muda as coisas - ver 1.
3. final existe.
Há também uma palavra-chave final na MQL4, embora a documentação não a mostre (que eu saiba). Possivelmente ela foi mencionada em uma atualização de compilação.
Correto!
Foi o Build 1430 para MQL5. Provavelmente na mesma época para a MQL4 com o compilador comum.
Oi, pessoal,
Estou trabalhando em uma classe exatamente como este posto, mas minha variável "pontuação" é um método. Como obter seu valor?
Este é o código desde o início do post:
Isto é o que estou tentando fazer:
A questão é, como usar getPrice() dentro do método Comparar()?
ObrigadoOi, pessoal,
Estou trabalhando em uma classe exatamente como este posto, mas minha variável "pontuação" é um método. Como obter seu valor?
Este é o código desde o início do post:
Isto é o que estou tentando fazer:
A questão é, como usar getPrice() dentro do método Compare()?
ObrigadoDeclare seu método getPrice() com a palavra chave const.
Declare seu método getPrice() com a palavra chave const.
Olá @Alain Verleyen,
Mudei o método getPrice(), inseri usando CopyClose() 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.