1

以下をコンパイルしようとすると、このエラーメッセージが表示されます

void MyClass::MyFunc() const
{
      int i= 0;
      myList.push_back(i);
}

関数自体の呼び出しと同じ問題を修正するために、 を返すにもかかわらず、関数に const を追加する必要がありましたvoidが、STL のメンバーで発生しているため、何かが非常に間違っていると考えています。私のコードで。参考までに、エラーは

cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'

コーディング標準とベスト プラクティスとの非常に虐待的な関係を持つ人からこれを受け継いだため、実際に何が起こっているのかほとんどわかりません。これがどのような問題の症状で、コードで何を探すべきかを誰かが教えてくれれば、とても助かります。

4

3 に答える 3

2

constメソッドの on は、インスタンス メンバーを含め、メソッドが呼び出されたインスタンスを変更できないことを意味します。

コード ベースを見て、クラス インスタンスを変更できるメソッド( であってはなりませんconst) と、クラス インスタンスに関する情報を提供するだけのメソッド ( であるべきです)を区別する必要がありますconst

于 2012-11-23T11:46:47.763 に答える
2

myListが のデータ メンバーであるMyClass場合、データ メンバーをpush_back()変更する(つまり、 が指すmyListのインスタンスを変更する) ため、メソッドを としてマークすることはできません。MyClassthisMyFunc()const

于 2012-11-23T11:45:38.753 に答える
0

$ 9.3.1 / 3:クラスメンバーアクセス構文(5.2.5)の一部ではなく、メンバー(5.3.1)へのポインターを形成するために使用されないid-expression(5.1)がクラスのメンバーで使用される場合これを使用できるコンテキストでのX(5.1.1)、名前ルックアップ(3.4)がid式の名前をクラスCの非静的非型メンバーに解決する場合、およびid式のいずれかである場合が評価される可能性があるか、CがXまたはXの基本クラスである場合、id式は(* this)(9.3.2)を後置式として使用してクラスメンバーアクセス式(5.2.5)に変換されます。 。オペレーター。

これが意味するのは、

myList.push_back(i);

として扱われます

(*this).myList.push_back(i);

$ 9.3.1 / 4:非静的メンバー関数は、const、volatile、またはconstvolatileとして宣言できます。これらのcv修飾子は、thisポインターのタイプに影響します(9.3.2)。

$ 9.3.2 / 1:非静的(9.3)メンバー関数の本体で、キーワードthisは、関数が呼び出されるオブジェクトのアドレスを値とするprvalue式です。クラスXのメンバー関数でのこのタイプはX*です。メンバー関数がconstと宣言されている場合、このタイプはconst X *であり、メンバー関数がvolatileと宣言されている場合、このタイプはvolatile X *であり、メンバー関数がconst volatileと宣言されている場合、このタイプはconstです。揮発性X*。

要約すると、これが意味するのは、メンバー関数の「this」のタイプである「const」は「MyClassconst*」です。事実上、これはMyclass::MyFunc、「this」ポインタが指すオブジェクトの状態を変更できないことを意味します。

myListのタイプがstd::listであるとすると、メソッドstd :: list :: push_backは、リストに「i」の値を挿入するときにインスタンス変数「myList」を変更します。

MyClass::MyFuncしかし、これは、オブジェクトの状態を変更しないことを約束する「const」メンバー関数のセマンティクスを破ります。

したがって、実際には、このメンバー関数から「const」を削除するか、const_castを使用してこの特定の操作のconstnessを削除する必要があります。

于 2012-11-23T12:25:33.213 に答える