web-dev-qa-db-ja.com

奇妙なC ++エラー:test.cpp:15:エラー:「*」の「this」引数として「const *」を渡すと修飾子が破棄される

特定のコードで問題が発生しています。この問題について誰かに教えていただければ幸いです。次のサンプルで問題を特定しました。

#include <iostream>

using namespace std;

class testing{
   int test();
   int test1(const testing& test2);
};

int testing::test(){
   return 1;
}

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

したがって、次のエラーを引き起こす可能性のあるものは何ですか?

test.cpp:15:エラー:「int testing :: test()」の「this」引数として「const Testing」を渡すと修飾子が破棄されます

どうもありがとう!

43
FurtiveFelon

メンバー関数test1の定義により、

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

変数test2のconst参照を渡しています。

つまり、test2のメンバーを変更したり、constまたはstaticではないメンバー関数を呼び出したりすることはできません。

修正方法は次のとおりです。

int testing::test() const {
   return 1;
}

最後の追加のconstは、現在のオブジェクトの内容を変更する予定がないことをコンパイラーに通知します(変更すると、別のコンパイルエラーが発生します)。

5
Brian R. Bondy

行:test2.test()

test2はconst参照ですが、非const関数を呼び出しています。それが問題です。これを修正するには、testing :: testをconst関数にします。

2

testing :: test1(const testing&test2)は、渡されたオブジェクトがconstであることを期待しています。その変数の値を変更するか、constとして明示的に定義されていないメソッドにアクセスすると、エラーが発生します。

Test()メソッドは実際にはデータを変更しないため、次のようにconstを設定することをお勧めします。

class testing{
   int test() const;
   int test1(const testing& test2);
};

int testing::test() const {
   return 1;
}

または、test1()の引数を定義するときにWord constを削除するだけで、渡されたオブジェクトのメソッドに自由にアクセスできます。

1
goldPseudo