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

 
Ex Ovo Omnia:

関数 Compare() で "this" の値を取得 するのに、なぜ演算子 "&" が 必要だったのでしょうか


なぜなら、Compare() メソッドは "const" であり、その内部で非 "const" メソッドを呼び出すことはできないからです。

この例では、2ページのコードを参照してください、メソッドgetPrice()はconstではなく、その中の関数 CopyClose()もconstではありません。すべてのメソッドは "const "に変換できますが、CopyClose()は変換できません。

いずれにせよ、演算子"&"はconstでないメソッドにアクセスできるので、constメソッドの 内部で呼び出すことができる。

 
Gustavo Hennemann:

なぜなら、Compare() メソッドは "const" であり、その内部で非 "const" メソッドを呼び出すことはできないからです。

この例では、2ページのコードを参照してください、メソッドgetPrice()はconstではなく、その内部にある関数 CopyClose()もconstではありません。すべてのメソッドは "const "に変更することができますが、CopyClose()はできません。

とにかく、演算子"&"はconstでないメソッドにアクセスできるので、"const "メソ ッドの内部で呼び出すことができる。


今わかった。私はそれが有効な構造であるかどうか、全く分かりませんが、おそらくあなたは知っているでしょう。私としては、MQLではJavaのように「const」メソッド宣言を完全に避けた方がいいと思います。

 
Ex Ovo Omnia:

なるほどね。私はそれが有効な構造であるかどうか見当もつきませんが、おそらくあなたはご存知でしょう。私としては、MQLではJavaのように「const」メソッド宣言を完全に避けた方が良いと思います。


標準ライブラリのコレクション・クラス(検索、ソートなど)の(非常に便利な)メソッドを利用するためには、CObjectのCompareメソッドをオーバーライド する必要があります。これは、Compareメソッド内から呼び出されるすべてのメソッドが、constメソッド でなければならないことを意味します。OPはこの詳細を回避したのではなく、「this」 ポインタを正しく使用しなかっただけなのです。つまり、OPは単にthis.DoSomething()を呼び出すのではなく、(self)オブジェクトへの自分自身のポインタを作成しました。

 
nicholishen:

stdライブラリのコレクションクラス(検索、ソートなど)の(非常に便利な)メソッドを利用するには、CObjectのCompareメソッドをオーバーライド する必要があります。これは、Compareメソッド内から呼び出されるすべてのメソッドが、constメソッド でなければならないことを意味します。OPはこの詳細を回避したわけではなく、this ポインタを正しく使用しなかっただけです。つまり、OPはthis.DoSomething()を呼び出す代わりに、単にthisキーワードを使用するのではなく、(self)オブジェクトへの自分自身のポインタを作成しました。


彼のやったことは理解できますが、問題は、この構造が(一般的に)無害かどうかということです。コンパイラは、オブジェクトが const 関数でそのメンバを変更することを想定していません。

 
Ex Ovo Omnia:

問題は、この構文が(一般に)無害かどうかということです。コンパイラは、オブジェクトがconst関数内でそのメンバを変更することを想定していません。

このケースでは、私は値を取得するだけで、何も変更していません。しかし、もしconst値を変更しようとすると、おそらくコンパイラはこの問題について警告を出すでしょうし、最悪の場合、実行時例外が発生するでしょう。

 
Ex Ovo Omnia:

問題は、この構文が(一般に)無害かどうかということです。コンパイラは、オブジェクトがconst関数内でメンバを変更することを想定していません。


ああ......。今わかりました、失礼しました。それは潜在的に危険かもしれませんね。OPはCompare()の視野内にあるすべてのメソッドもconst メソッドであることを確認する必要があります。

 
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メソッドを呼び出すことができないために発生すると思われます。

返信が遅くなり申し訳ありません。

CopyBuffer()を使用する際に、なぜgetPrice()をconstとして宣言しなかったのか、まだわかりません。このような場合、getPrice()を更新したバージョンを投稿してもらえますか?

 

最新情報