2017-11-02 8 views
0

は私の問題は、の次のサンプルを見てみましょう証明するために動作しません。既存の点と引数点の間の距離を返します。C++クラスの関数は別の関数内で意図したとおり

問題は次のとおりです。main()では、この関数は機能します(エラーは発生しません)。しかし、WriteDistance()関数には、the object has type qualifiers that are not compatible with the member function "MyClass::distance"'long double MyClass::distance(const MyClass &)': cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'というエラーがあります。

距離関数をオーバーロードすると(1つのMyClassオブジェクトだけでなく、おそらく2つの長い2倍も使用できます)、エラーはno instance of overloaded function "MyClass::distance" matches the argument list and object (the object has type qualifiers that prevent a match)'MyClass::distance': 2 overloads have no legal conversion for 'this' pointerとなります。

質問は、なぜこのエラーが発生し、それを防止するのですか?私は、MyClass &aconstを削除していないので( "const"を削除すると)、エラーが取り除かれます。しかし、なぜ?このサイトのメンバーは、オブジェクトのコピーを防ぐために常にconstの参照を渡すために無数の時間を教えてくれました。もし私がconst参照を渡すことができない場合、それは私の関数WriteDistanceが何らかの方法でオブジェクトを変更することを意味しますか?それを実際に持っていることにいくつかの回避策がありますかconst

答えて

4

あなたdistance機能を使用すると、タイプconst MyClassの値にそれを使用することができない理由である、それは上と呼ばれるオブジェクトを変更すると主張します。

あなたは

long double distance(const MyClass &b) const { 
//          ^^^^^ 

この第二のconstとしてそれを宣言する必要があります(つまり*thisは、関数内constである)、それはクラスのメンバーを変更しないことを意味します。

+0

これは私が探していた答えです。私は、欲求が私が望んでいたものを理解しました。ありがとうございました! – user16320

3

は、次の2つのパラメータを持つ関数を宣言したい場合、それは、静的作る修飾子constの

long double distance(const MyClass &b) const { 
//... 

でメンバ関数を宣言します。例えば

static long double distance(const MyClass &a, const MyClass &b) { 
//... 
+0

のようにこれは面白いです:「あなたは二つのパラメータを持つ関数を宣言したい場合、それは、静的にします。」なぜ説明できますか? – user16320

-1

constオブジェクト用にconst修飾バージョン機能を追加する必要があります。通常は、2つのバージョン関数宣言、constと非constを提供します。 constのバージョンがconstのClassオブジェクトのために使用されている、あなたののconst MyClassの& B

void WriteDistance(const MyClass &a, const MyClass &b) const { 
    cout << a.distance(b) << endl; 
} 
+1

私のdownvoteではなく、実際にconstであるメソッドのconstと非constバージョンを提供するのは無意味です。なぜならconst以外のオブジェクトに対してconstメソッドを呼び出すことができるからです。さらに、メンバ関数を作る代わりに2つのパラメータを渡すことも可能ですが、空の関数の場合は ')const {'が間違っています – user463035818

関連する問題