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

 
Gustavo Hennemann:

Привет @Alain Verleyen,

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

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

Покажите, пожалуйста, ваш обновленный код.
 

Очевидно, я решил проблему, используя оператор "&" в функции Compare() для получения значения "this":


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" в сравнении.

Но почему бы вам не использовать функцию "operator" вместо функции "Compare"? Так код будет легче читать в дальнейшем.

 
Doerk Hilger:

Вы можете отбросить thisObject и заменить его на "this" в сравнении.

Но почему бы вам не использовать функцию "operator" вместо функции "Compare"? Так код будет легче читать в дальнейшем.


Потому что это полиморфный метод базового класса CObject, и он должен быть переопределен, чтобы реализовать сортировку и поиск в классах Collection, CArrayObj и CList.

 
Gustavo Hennemann:

По-видимому, я решил проблему, используя оператор "&" в функции Compare() для получения значения "this":



Наконец я получил значение, которое ожидал.


Я не уверен, чего вы надеетесь достичь с помощью этой логики. Обычно вы хотите сравнивать только одинаковые элементы для сортировки и поиска.

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

Я не уверен, чего вы надеетесь достичь с помощью этой логики. Обычно вы хотите сравнивать только одинаковые элементы для сортировки и поиска.

Именно, теперь это сортировка, до этого я не мог сделать сравнение, получал ошибки, ошибки и ошибки. Теперь это работает.

Этот подход не очевиден и его нет ни в одном документе, мне пришлось провести много тестов и "проб и ошибок", пока яэтогоне добился. Надеюсь, решение понравится и другим.

 
Gustavo Hennemann:

Именно, теперь он сортирует, до этого я не мог сделать сравнение, получал ошибки и ошибки и ошибки. Теперь это работает.

Этот подход не очевиден и его нет ни в одном документе, мне пришлось провести много тестов и "проб и ошибок", пока яэтогоне добился. Надеюсь, решение понравится и другим.


Мне просто интересно, зачем вам понадобился оператор "&" вфункции Compare(), чтобы получить значение "this".


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:

Мне просто интересно, зачем вам понадобился оператор "&" вфункции Compare() для получения значения "this".


Это эквивалентно использованию GetPointer(this)
 
nicholishen:
Это эквивалентно использованию GetPointer(this)

Это не отвечает на вопрос "почему". Не было никакой причины раскрывать указатель на себя.

 
Ex Ovo Omnia:

Это не отвечает на вопрос "почему". Не было причин раскрывать указатель на себя.

Нет, определенно не в этом примере, поскольку это лишнее извлечение, но допустим, вы передаете это методу, который принимает только указатель, тогда вам нужно использовать это... method(&this)
Причина обращения: