CList sort() çalışması için CObject içindeki Compare() nasıl geçersiz kılınır? - sayfa 2

 
whroeder1 :
  1. MT4/5'in son bir anahtar kelimesi yok

Ayrıca, bu yanlıştır - MQL5'te bir 'final' anahtar kelimesi vardır.

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

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

CFoo nihai olduğundan bu, CBar'ın derlenmesine izin vermez.

 
Amir Yacoby :
Burada yanılıyorsun, whroeder1.
Tabana sanal eklememek polimorfizmi kaybetmenize neden olur - yöntem çalışma zamanında dinamik olarak değil statik olarak çağrılır.

Bu, whroeder1'in bahsettiği uyarıydı.

wroeder1 :
  1. Sanal eklememek kötü bir uygulamadır, ancak gerekli değildir ( CObject dışında. )
  2. Sanal değişiklikleri hiçbir şey eklememek, türetilmiş bir sınıfta hala geçersiz kılınabilir.
  3. MT4/5'in son bir anahtar kelimesi yok
 
Amir Yacoby :

Ayrıca, bu yanlıştır - MQL5'te bir 'final' anahtar kelimesi vardır.

MQL4'te ayrıca belgeler göstermese de (bildiğim kadarıyla) bir final anahtar sözcüğü vardır. Muhtemelen bir yapı güncellemesinde bahsedilmiştir.
 
CObject dışında ne anlama geldiği açık değildir, ancak her neyse, 1-2 numaralı noktalar yanıltıcıdır:
1. Bu sadece kötü bir uygulama değildir, aynı zamanda polimorfizm gerekliyse her tabanda (sadece CObject'de değil) gereklidir.
2. Bir şeyleri değiştirir - bkz. 1.
3. final var.
 
honest_knave :
MQL4'te ayrıca belgeler göstermese de (bildiğim kadarıyla) bir final anahtar sözcüğü vardır. Muhtemelen bir yapı güncellemesinde bahsedilmiştir.
Doğru!
 
Amir Yacoby :
Doğru!
MQL5 için Build 1430 idi. Muhtemelen ortak derleyici ile MQL4 için aynı zamanda.
 
honest_knave :
MQL5 için Build 1430 idi. Muhtemelen ortak derleyici ile MQL4 için aynı zamanda.
Evet, oradan aldım. Belgeler birçok kez gecikiyor, değişiklik listelerini kontrol etmek iyi bir uygulamadır.
 

Merhaba millet,

Tam olarak bu gönderiye benzer bir sınıfta çalışıyorum, ancak "puan" değişkenim bir yöntemdir. Değeri nasıl elde edilir?

Yazının başındaki kod bu:

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


Yapmaya çalıştığım şey bu:

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

Soru, GetPrice() öğesinin Compare() yönteminin içinde nasıl kullanılacağıdır?

teşekkürler
 
Gustavo Hennemann :

Merhaba millet,

Tam olarak bu gönderiye benzer bir sınıfta çalışıyorum, ancak "puan" değişkenim bir yöntemdir. Değeri nasıl elde edilir?

Yazının başındaki kod bu:


Yapmaya çalıştığım şey bu:

Asıl soru, GetPrice() öğesinin Compare() yönteminin içinde nasıl kullanılacağıdır?

teşekkürler

const anahtar sözcüğü ile getPrice() yönteminizi bildirin.

   double          getPrice() const
 
Alain Verleyen :

const anahtar sözcüğü ile getPrice() yönteminizi bildirin.

Merhaba @Alain Verleyen ,

GetPrice() yöntemini değiştirdim, CopyClose() kullanarak yerleştirdim CopyBuffer() kullanıyorum. Bu ana hedefi değiştirmez.

Bu nedenle, getPrice() yönteminde "const" anahtar sözcüğünü kullanırsam, şu hatayı alıyorum: " 'CopyBuffer' - aşırı yüklemelerin hiçbiri " işlev çağrısına uygulanamaz . Bunun, CopyBuffer bir const yöntemi olmadığı ve bir const yöntemi içinde const olmayan yöntemi çağırmanın mümkün olmadığı için gerçekleştiğini düşünüyorum.