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

 
Gustavo Hennemann :

안녕하세요 @Alain Verleyen

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

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

업데이트된 코드를 보여주세요.
 

분명히 나는 "this" 값을 얻기 위해 Compare() 함수 에서 "&" 연산자를 사용하여 문제를 해결했습니다.


 int PriceScore::Compare( const CObject *node, const int mode= 0 ) const
{
   PriceScore *thisObject = (PriceScore*)& this ;
   PriceScore *pc = (PriceScore*)node;

   Print ( __FUNCTION__ , ":Compare called. Incoming: " , pc.Score(), " This: " , score);
   
   if (pc.Score() < thisObject.getPrice())
       return 1 ;
   else if (pc.Score() > thisObject.getPrice())
       return - 1 ;
   else
       return 0 ;
}


마침내 나는 내가 기대했던 값을 얻었다.

 

thisObject를 삭제하고 비교에서 "this"로 바꿀 수 있습니다.

그러나 "비교" 기능 대신 "연산자" 기능을 사용하지 않는 이유는 무엇입니까? 나중에 코드를 읽기 쉽게 만듭니다.

 
Doerk Hilger :

thisObject를 삭제하고 비교에서 "this"로 바꿀 수 있습니다.

그러나 "비교" 기능 대신 "연산자" 기능을 사용하지 않는 이유는 무엇입니까? 나중에 코드를 읽기 쉽게 만듭니다.


기본 클래스 CObject의 다형성 메서드이고 Collection 클래스, CArrayObj 및 CList에서 정렬 및 검색 구현하려면 재정의해야 하기 때문입니다.

 
Gustavo Hennemann :

분명히 나는 "this" 값을 얻기 위해 Compare() 함수 에서 "&" 연산자를 사용하여 문제를 해결했습니다.



마침내 나는 내가 기대했던 값을 얻었다.


나는 당신이 이 논리로 무엇을 성취하기를 바라는지 잘 모르겠습니다. 일반적으로 정렬 및 검색을 위해 동일한 요소만 비교하려고 합니다.

...
if ( this .thingToSort > other.thingToSort) return 1 ;
...
 
nicholishen :

나는 당신이 이 논리로 무엇을 성취하기를 바라는지 잘 모르겠습니다. 일반적으로 정렬 및 검색을 위해 동일한 요소만 비교하려고 합니다.

정확히는 지금 정렬 중인데, 그 전에는 비교를 할 수 없었고, 오류와 오류, 오류가 발생했습니다. 이제 작동합니다.

이 접근 방식은 명확하지 않고 어떤 문서에도 없습니다. 나는 이것을 얻기 까지 많은 테스트와 "시행 착오" 를 해야 했습니다. 다른 사람들이 솔루션을 즐길 수 있기를 바랍니다.

 
Gustavo Hennemann :

정확히는 지금 정렬 중인데, 그 전에는 비교를 할 수 없었고, 오류와 오류, 오류가 발생했습니다. 이제 작동합니다.

이 접근 방식은 명확하지 않고 어떤 문서에도 없습니다. 나는 이것을 얻기 까지 많은 테스트와 "시행 착오" 를 해야 했습니다. 다른 사람들이 솔루션을 즐길 수 있기를 바랍니다.


"this" 값을 얻기 위해 Compare( ) 함수 에서 "&" 연산자 가 필요한 이유가 궁금합니다.


 int PriceScore::Compare( const CObject *node, const int mode= 0 ) const
{
   /* PriceScore *thisObject = (PriceScore*)& this ; */
   PriceScore *pc = (PriceScore*)node;

   Print ( __FUNCTION__ , ":Compare called. Incoming: " , pc.Score(), " This: " , score);
   
   if (pc.Score() < /*thisObject.*/getPrice())
       return 1 ;
   else if (pc.Score() > /*thisObject.*/getPrice())
       return - 1 ;
   else
       return 0 ;
}
 
Ex Ovo Omnia :

"this" 값을 얻기 위해 Compare( ) 함수 에서 "&" 연산자 가 필요한 이유가 궁금합니다.


GetPointer(this)를 사용하는 것과 같습니다.
 
nicholishen :
GetPointer(this)를 사용하는 것과 같습니다.

글쎄, 그것은 "왜"라는 질문에 대답하지 않습니다. 자기 자신을 가리키는 포인터를 공개할 이유가 없었다.

 
Ex Ovo Omnia :

글쎄, 그것은 "왜"라는 질문에 대답하지 않습니다. 자기 자신을 가리키는 포인터를 공개할 이유가 없었다.

아니요, 중복 추출이기 때문에 이 예제에서는 확실히 아니지만 포인터만 허용하는 메서드에 이것을 전달했다고 가정해 보겠습니다. 그러면 이 메서드를 사용해야 합니다... method(&this)