如何重写CObject中的Compare(),使CList sort()工作? - 页 3

 
Gustavo Hennemann:

你好@Alain Verleyen,

我改变了getPrice()的方法,不再使用CopyClose(),而是使用CopyBuffer()。这并没有改变主要目标。

因此,如果我在getPrice()方法中使用 "const "关键字,就会出现错误。"'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)