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

 
whroeder1:
  1. MT4/5 no tiene una palabra clave final

Además, esto es incorrecto - hay una palabra clave 'final' en MQL5.

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

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

Esto no permitirá que CBar compile porque CFoo es final.

 
Amir Yacoby:
Aquí te equivocas, whroeder1.
No añadir virtual en la base te hará perder el polimorfismo - el método será llamado estáticamente y no dinámicamente en tiempo de ejecución.

Esta fue la advertencia que whroeder1 mencionó.

whroeder1:
  1. No añadir el virtual es una mala práctica, pero no es necesario(excepto en el CObject.)
  2. No añadir el virtual no cambia nada, todavía puede ser anulado en una clase derivada.
  3. MT4/5 no tiene una palabra clave final
 
Amir Yacoby:

Además, esto es incorrecto - hay una palabra clave "final" en MQL5.

También hay una palabra clave final en MQL4, aunque la documentación no lo muestra (que yo sepa). Posiblemente se mencionó en una actualización de la construcción.
 
No está claro lo que significa excepto en CObject, pero de todos modos, los puntos 1-2 son engañosos:
1. No sólo es una mala práctica, sino que se requiere en cada base (no sólo en CObject) si se requiere polimorfismo.
2. Sí cambia las cosas - ver 1.
3. Final sí existe.
 
honest_knave:
También hay una palabra clave final en MQL4, aunque la documentación no la muestra (que yo sepa). Posiblemente se mencionó en una actualización de la construcción.
Correcto.
 
Amir Yacoby:
Correcto.
Fue la Build 1430 para MQL5. Probablemente alrededor del mismo tiempo para MQL4 con el compilador común.
 
honest_knave:
Fue la Build 1430 para MQL5. Probablemente alrededor del mismo tiempo para MQL4 con el compilador común.
Sí, de ahí lo saqué. La documentación se retrasa muchas veces, es una buena práctica comprobar las listas de cambios.
 

Hola chicos,

Estoy trabajando en una clase exactamente igual a la de este post, pero mi variable "score" es un método. ¿Cómo obtener su valor?

Este es el código del principio del 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;
}


Esto es lo que estoy tratando de hacer:

#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;
}

La pregunta es, ¿cómo usar getPrice() dentro del método Compare()?

Gracias
 
Gustavo Hennemann:

Hola chicos,

Estoy trabajando en una clase exactamente igual a la de este post, pero mi variable "score" es un método. ¿Cómo obtener su valor?

Este es el código del principio del post:


Esto es lo que estoy tratando de hacer:

La pregunta es, ¿cómo usar getPrice() dentro del método Compare()?

Gracias

Declarar el método getPrice() con la palabra clave const.

   double         getPrice() const
 
Alain Verleyen:

Declare su método getPrice() con la palabra clave const.

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.