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

 
whroeder1:
  1. O MT4/5 não tem uma palavra-chave final

Além disso, isto está errado - há uma palavra-chave 'final' na MQL5.

class CFoo final
  {
  //--- class body
  };

class CBar : public CFoo
  {
  //--- class body
  };

isto não deixará a CBar compilar porque o CFoo é final.

 
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:
  1. Não adicionar o virtual é má prática, mas não é necessário(exceto no CObject.)
  2. Não adicionar o virtual não muda nada, ele ainda pode ser anulado em uma classe derivada.
  3. O MT4/5 não tem uma palavra-chave final
 
Amir Yacoby:

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.
Correto!
 
Amir Yacoby:
Correto!
Era Build 1430 para MQL5. Provavelmente na mesma época para a MQL4 com o compilador comum.
 
honest_knave:
Foi o Build 1430 para MQL5. Provavelmente na mesma época para a MQL4 com o compilador comum.
Sim, foi daí que eu o obtive. A documentação fica muitas vezes atrasada, é uma boa prática verificar as listas de mudanças.
 

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:

#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,const int mode=0);
   void           Price(const int p){price = p;}
   int            Price() const {return price;}
   void           Score(const int s){score = s;}
   int            Score() const {return score;}
  
};

int PriceScore::Compare(const CObject *node,const int 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)return 1;
   else if(pc.Score()> score) return -1;
   else return 0;
}


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){}
   virtual int    Compare(const CObject *node,const int mode=0) override const;
   void           setPrice(const int p){price = p;}
   //this is a simple function to get the close price of today
   double         getPrice()
                  {
                     double arrayPrice[1];
                     CopyClose(mySymbol, myTimeFrame, today, 1, arrayPrice);
                     return arrayPrice[0];
                  }
   void           Score(const int s){score = s;}
   int            Score() const {return score;}
  
};

int PriceScore::Compare(const CObject *node,const int 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()???
      return 1;
   else if(pc.Score() > getPrice()) //here is the problem, how to use getPrice()???
      return -1;
   else
      return 0;
}

A questão é, como usar getPrice() dentro do método Comparar()?

Obrigado
 
Gustavo Hennemann:

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 Compare()?

Obrigado

Declare seu método getPrice() com a palavra chave const.

   double         getPrice() const
 
Alain Verleyen:

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.