CObjectでCompare()をオーバーライドして、CList sort()を動作させるには? - ページ 3

 
Gustavo Hennemann:

こんにちは、@Alain Verleyen です。

getPrice()メソッドを変更し、CopyClose()の代わりにCopyBuffer()を使っています。これは、主な目的を変更するものではありません。

そのため、getPrice()メソッドで "const "キーワードを使用すると、エラーが発生します。"'CopyBuffer' - no one of the overloads can be applied to the function call"というエラーが発生します。これは、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に置き換えることができます。

しかし、なぜ関数「比較」ではなく、「演算子」機能を 使わないのだろうか?後でコードを読むのが楽になる。

 
Doerk Hilger:

比較の際にthisObjectを削除し、thisに置き換えることができます。

しかし、なぜ関数「比較」ではなく、「演算子」機能を 使わないのだろうか?後でコードを読むのが楽になる。


なぜなら、これはベースクラス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)を使うのと同じことです。

さて、それでは「なぜ」という問いに答えられない。selfへのポインタを明らかにする理由がないのです。

 
Ex Ovo Omnia:

さて、それでは「なぜ」という問いに答えられない。selfへのポインタを明らかにする理由はないのです。

いや、この例では冗長な抽出なので間違いなくない。しかし、ポインタしか受け付けないメソッドにこれを渡すとしたら、これを使う必要があるだろう...method(&this)