CList sort()가 작동하도록 CObject에서 Compare()를 재정의하는 방법은 무엇입니까? - 페이지 2

 
whroeder1 :
  1. MT4/5에는 최종 키워드가 없습니다.

또한 이것은 잘못되었습니다. MQL5에는 '최종' 키워드가 있습니다.

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

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

CFoo가 최종이기 때문에 CBar가 컴파일되지 않습니다.

 
Amir Yacoby :
당신이 틀렸어요, whoroeder1.
기본에 가상을 추가하지 않으면 다형성을 잃게 됩니다. 메서드는 런타임에 동적으로 호출되지 않고 정적으로 호출됩니다.

이것은 whoroder1이 언급한 경고였습니다.

누가 1 :
  1. 가상 을 추가하지 않는 것은 나쁜 습관이지만 필수는 아닙니다( CObject 제외).
  2. 가상 변경 사항을 추가하지 않으면 파생 클래스에서 여전히 재정의될 수 있습니다.
  3. MT4/5에는 최종 키워드가 없습니다.
 
Amir Yacoby :

또한 이것은 잘못되었습니다. MQL5에는 '최종' 키워드가 있습니다.

MQL4에는 최종 키워드도 있지만 설명서에는 표시되지 않습니다(내가 아는 한). 아마도 빌드 업데이트에서 언급되었을 것입니다.
 
CObject 를 제외하고 무엇을 의미하는지 명확하지 않지만 어쨌든 포인트 1-2는 오해의 소지가 있습니다.
1. 나쁜 습관일 뿐만 아니라 다형성이 필요한 경우 모든 기반(CObject 뿐만 아니라)에 필요합니다.
2. 그것은 상황을 변화시킵니다 - 1 참조.
3. final이 존재합니다.
 
honest_knave :
MQL4에는 최종 키워드도 있지만 설명서에는 표시되지 않습니다(내가 아는 한). 아마도 빌드 업데이트에서 언급되었을 것입니다.
옳은!
 
Amir Yacoby :
옳은!
MQL5용 빌드 1430이었습니다. 아마도 공통 컴파일러를 사용하는 MQL4의 경우 거의 같은 시간일 것입니다.
 
honest_knave :
MQL5용 빌드 1430이었습니다. 아마도 공통 컴파일러를 사용하는 MQL4의 경우 거의 같은 시간일 것입니다.
네, 거기서 얻었습니다. 문서는 여러 번 지연되므로 변경 목록을 확인 하는 것이 좋습니다.
 

안녕하세요 여러분,

이 게시물과 똑같은 클래스에서 작업하고 있지만 "점수" 변수는 메서드입니다. 그 가치를 얻는 방법?

이것은 게시물 시작 부분의 코드입니다.

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

문제는 Compare() 메서드 내에서 getPrice()를 사용하는 방법입니다.

감사해요
 
Gustavo Hennemann :

안녕하세요 여러분,

이 게시물과 똑같은 클래스에서 작업하고 있지만 "점수" 변수는 메서드입니다. 그 가치를 얻는 방법?

이것은 게시물 시작 부분의 코드입니다.


이것이 내가하려는 일입니다.

문제는 Compare() 메서드 내에서 getPrice()를 사용하는 방법입니다.

감사해요

const 키워드로 getPrice() 메소드를 선언하십시오.

   double          getPrice() const
 
Alain Verleyen :

const 키워드로 getPrice() 메소드를 선언하십시오.

안녕하세요 @Alain Verleyen

CopyClose()를 사용하여 getPrice() 메서드를 변경했습니다. CopyBuffer()를 사용하고 있습니다. 이것은 주요 목표를 변경하지 않습니다.

따라서 getPrice() 메서드에서 "const" 키워드를 사용하면 " 'CopyBuffer' - 어떤 오버로드도 함수 호출에 적용될 수 없습니다 ."라는 오류가 발생합니다. CopyBuffer가 const 메서드가 아니고 const 메서드 내에서 non const 메서드를 호출할 수 없기 때문에 발생한다고 생각합니다.