Comment surcharger Compare() dans CObject pour que CList sort() fonctionne ? - page 2

 
whroeder1:
  1. MT4/5 n'a pas de mot clé " final".

De plus, c'est une erreur - il existe un mot-clé "final" dans MQL5.

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

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

Cela ne permettra pas à CBar de compiler parce que CFoo est final.

 
Amir Yacoby:
Vous avez tort ici, whroeder1.
Ne pas ajouter virtual dans la base vous fera perdre le polymorphisme - la méthode sera appelée statiquement et non dynamiquement au moment de l'exécution.

C'est la mise en garde mentionnée par Whroeder1.

whroeder1:
  1. Ne pas ajouter le virtuel est une mauvaise pratique, mais n'est pas obligatoire(sauf dans le CObject).
  2. Ne pas ajouter le virtuel ne change rien, il peut toujours être surchargé dans une classe dérivée.
  3. MT4/5 n'a pas de mot clé final.
 
Amir Yacoby:

De plus, c'est une erreur - il existe un mot-clé "final" dans MQL5.

Il existe également un mot-clé final dans MQL4, bien que la documentation ne le montre pas (à ma connaissance). Il est possible que cela ait été mentionné dans une mise à jour de la compilation.
 
La signification de "does except in CObject " n'est pas claire, mais de toute façon, les points 1-2 sont trompeurs :
1. Ce n'est pas seulement une mauvaise pratique, mais c'est requis dans chaque base (pas seulement dans CObject) si le polymorphisme est requis.
2. Cela change les choses - voir 1.
3. La finale existe.
 
honest_knave:
Il existe également un mot-clé final dans MQL4, bien que la documentation ne le montre pas (à ma connaissance). Il est possible qu'il ait été mentionné dans une mise à jour de la compilation.
Correct !
 
Amir Yacoby:
C'est exact !
C'était la Build 1430 pour MQL5. Probablement à peu près au même moment pour MQL4 avec le compilateur commun.
 
honest_knave:
C'était la version 1430 pour MQL5. Probablement à peu près au même moment pour MQL4 avec le compilateur commun.
Oui, c'est de là que je l'ai obtenu. La documentation est souvent en retard, c'est une bonne pratique de vérifier les listes de modifications.
 

Bonjour à tous,

Je travaille dans une classe exactement comme ce post, mais ma variable "score" est une méthode. Comment obtenir sa valeur ?

Voici le code du début de l'article :

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


C'est ce que j'essaie de faire :

#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 question est, comment utiliser getPrice() dans la méthode Compare() ?

Merci
 
Gustavo Hennemann:

Bonjour à tous,

Je travaille dans une classe exactement comme ce post, mais ma variable "score" est une méthode. Comment obtenir sa valeur ?

Voici le code du début de l'article :


Voici ce que j'essaie de faire :

La question est, comment utiliser getPrice() dans la méthode Compare() ?

Merci

Déclarez votre méthode getPrice() avec le mot clé const.

   double         getPrice() const
 
Alain Verleyen:

Déclarez votre méthode getPrice() avec le mot clé const.

Salut @Alain Verleyen,

J'ai changé la méthode getPrice(), au lieu d'utiliser CopyClose() j'utilise CopyBuffer(). Cela ne change pas l'objectif principal.

Donc, si j'utilise le mot clé "const" dans la méthode getPrice(), j'obtiens l'erreur : "'CopyBuffer' - aucune des surcharges ne peut être appliquée à l'appel de fonction". Je pense que cela se produit parce que CopyBuffer n'est pas une méthode const, et il n'est pas possible d'appeler une méthode non const à l'intérieur d'une méthode const.