Как переопределить Compare() в CObject, чтобы CList sort() работал? - страница 2

 
whroeder1:
  1. В MT4/5 нет ключевого слова final.

Кроме того, это неправильно - в MQL5 есть ключевое слово 'final'.

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

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

Это не позволит CBar компилироваться, потому что CFoo является final.

 
Amir Yacoby:
Здесь вы ошибаетесь, whroeder1.
Не добавление virtual в базу приведет к потере полиморфизма - метод будет вызываться статически, а не динамически во время выполнения.

Это была оговорка, о которой упомянул whroeder1.

whroeder1:
  1. Не добавлять virtual - плохая практика, но не обязательная(за исключением CObject).
  2. Не добавление virtual ничего не меняет, он все равно может быть переопределен в производном классе.
  3. В MT4/5 нет ключевого слова final.
 
Amir Yacoby:

Кроме того, это неверно - в MQL5 есть ключевое слово 'final'.

В MQL4 также есть ключевое слово final, хотя в документации оно не указано (насколько мне известно). Возможно, оно было упомянуто в обновлении сборки.
 
Не совсем понятно, что значит "кроме как в CObject ", но в любом случае, пункты 1-2 вводят в заблуждение:
1. Это не только плохая практика, но и требуется в каждой базе (не только в CObject), если требуется полиморфизм.
2. Это действительно меняет ситуацию - см. 1.
3. final существует.
 
honest_knave:
В MQL4 также есть ключевое слово final, хотя в документации оно не указано (насколько мне известно). Возможно, оно было упомянуто в обновлении сборки.
Правильно!
 
Amir Yacoby:
Правильно!
Это был Build 1430 для MQL5. Возможно, примерно в то же время для MQL4 с общим компилятором.
 
honest_knave:
Это был Build 1430 для MQL5. Возможно, примерно в то же время для MQL4 с общим компилятором.
Да, именно оттуда я его и взял. Документация отстает во много раз, это хорошая практика - проверять списки изменений.
 

Привет, ребята,

Я работаю в классе, точно таком же, как этот пост, но моя переменная "score" является методом. Как получить ее значение?

Это код из начала поста:

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


Вот что я пытаюсь сделать:

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

Вопрос в том, как использовать getPrice() внутри метода Compare()?

Спасибо
 
Gustavo Hennemann:

Привет, ребята,

Я работаю в классе, точно таком же, как этот пост, но моя переменная "score" является методом. Как получить ее значение?

Это код из начала поста:


Вот что я пытаюсь сделать:

Вопрос в том, как использовать getPrice() внутри метода Compare()?

Спасибо

Объявите свой метод getPrice() с ключевым словом const.

   double         getPrice() const
 
Alain Verleyen:

Объявите свой метод getPrice() с ключевым словом const.

Привет @Alain Verleyen,

Я изменил метод getPrice(), вместо CopyClose() я использую CopyBuffer(). Это не меняет основной задачи.

Так вот, если я использую ключевое слово "const" в методе getPrice(), то получаю ошибку: "'CopyBuffer' - ни одна из перегрузок не может быть применена к вызову функции". Я думаю, это происходит потому, что CopyBuffer не является const-методом, и невозможно вызвать не const-метод внутри const-метода.