Come sovrascrivere Compare() in CObject in modo che CList sort() funzioni? - pagina 2

 
whroeder1:
  1. MT4/5 non ha una parola chiave finale

Inoltre, questo è sbagliato - c'è una parola chiave 'final' in MQL5.

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

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

Questo non permetterà a CBar di compilare perché CFoo è finale.

 
Amir Yacoby:
Qui ti sbagli, whroeder1.
Non aggiungere virtual nella base ti farà perdere il polimorfismo - il metodo sarà chiamato staticamente e non dinamicamente a tempo di esecuzione.

Questo era l'avvertimento menzionato da whroeder1.

whroeder1:
  1. Non aggiungere il virtuale è una cattiva pratica, ma non è richiesto(tranne che nel CObject.)
  2. Non aggiungere il virtuale non cambia nulla, può ancora essere sovrascritto in una classe derivata.
  3. MT4/5 non ha una parola chiave finale
 
Amir Yacoby:

Inoltre, questo è sbagliato - c'è una parola chiave 'final' in MQL5.

C'è anche una parola chiave 'final' in MQL4, anche se la documentazione non la mostra (a mia conoscenza). Forse è stata menzionata in un aggiornamento della build.
 
Non è chiaro cosa significa except in CObject, ma comunque i punti 1-2 sono fuorvianti:
1. Non è solo una cattiva pratica, ma è richiesto in ogni base (non solo in CObject) se è richiesto il polimorfismo.
2. Cambia le cose - vedi 1.
3. final esiste.
 
honest_knave:
C'è anche una parola chiave finale in MQL4, anche se la documentazione non la mostra (a mia conoscenza). Forse è stata menzionata in un aggiornamento della build.
Corretto!
 
Amir Yacoby:
Corretto!
Era la build 1430 per MQL5. Probabilmente nello stesso periodo per MQL4 con il compilatore comune.
 
honest_knave:
Era la build 1430 per MQL5. Probabilmente nello stesso periodo per MQL4 con il compilatore comune.
Sì, è da lì che l'ho presa. La documentazione è spesso in ritardo, è una buona pratica controllare le liste dei cambiamenti.
 

Ciao ragazzi,

Sto lavorando in una classe esattamente come questo post, ma la mia variabile "score" è un metodo. Come ottenere il suo valore?

Questo è il codice dall'inizio 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;
}


Questo è quello che sto cercando di fare:

#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 domanda è: come usare getPrice() all'interno del metodo Compare()?

Grazie
 
Gustavo Hennemann:

Ciao ragazzi,

Sto lavorando in una classe esattamente come questo post, ma la mia variabile "score" è un metodo. Come ottenere il suo valore?

Questo è il codice dall'inizio del post:


Questo è quello che sto cercando di fare:

La domanda è: come usare getPrice() all'interno del metodo Compare()?

Grazie

Dichiarare il metodo getPrice() con la parola chiave const.

   double         getPrice() const
 
Alain Verleyen:

Dichiara il tuo metodo getPrice() con la parola chiave const.

Ciao @Alain Verleyen,

Ho cambiato il metodo getPrice(), invece di usare CopyClose() sto usando CopyBuffer(). Questo non cambia l'obiettivo principale.

Quindi, se utilizzo la parola chiave "const" nel metodo getPrice(), ottengo l'errore: "'CopyBuffer' - nessuno degli overloads può essere applicato alla chiamata di funzione". Penso che questo accada perché CopyBuffer non è un metodo const, e non è possibile chiamare un metodo non const all'interno di un metodo const.