C は非常に強力なプログラミング言語ですが、C を学習して使用すると、必ずいくつかの問題に遭遇します。初心者を悩ませることが多い問題の 1 つは、「const オブジェクトでは非 const メンバー関数を呼び出すことはできません」というエラー メッセージです。この記事では、このエラーに対処する方法について説明します。
まず、このエラー メッセージを理解するには、いくつかの基本的な知識を知っておく必要があります。 C には const キーワードがあり、変数、ポインター、関数パラメーターを変更するために使用でき、これらのオブジェクトが変更できないことを示します。 C では、オブジェクトが const 宣言されている場合、そのメンバー関数も const 宣言される必要があります。
const オブジェクトを使用して非 const メンバー関数を呼び出すと、コンパイラによって「const オブジェクトでは非 const メンバー関数を呼び出すことはできません。」というエラーが表示されます。これは、C では const オブジェクトが読み取り専用であり、変更できないためです。非 const メンバー関数はオブジェクトの状態を変更する可能性があるため、const オブジェクトと一緒に呼び出すことはできません。
それでは、このエラーにはどう対処すればよいのでしょうか?まず、このメンバー関数がオブジェクトの状態を変更する必要があるかどうかを判断する必要があります。オブジェクトの状態を変更する必要がない場合は、このメンバー関数を const として宣言する必要があります。このようにすると、このメンバー関数を const オブジェクトを使用して呼び出しても、エラーは発生しません。
たとえば、次のクラスがあるとします。
class Person { public: //getter函数,在不修改对象的情况下获取成员变量的值 std::string getName() const; // setter函数,修改对象的成员变量值 void setName(std::string name); private: std::string m_name; };
このクラスでは、getName 関数は m_name の値を取得するだけで、オブジェクトの状態は変更しません。したがって、これを const として宣言する必要があります:
std::string getName() const;
さらに、この関数を定義するときは、関数名の後に const キーワードも追加する必要があります:
std::string Person::getName() const { return m_name; }
このように、たとえuse const オブジェクトが getName 関数を呼び出した場合、エラーは発生しません。
メンバー関数がオブジェクトの状態を変更する必要がある場合、それを const として宣言することはできません。ただし、const オブジェクトを使用してこの関数を呼び出したい場合は、このオブジェクトを非 const オブジェクトに変換できます。この目的を達成するには、型変換を使用できます。たとえば、const Person オブジェクト p があり、setName 関数を使用して p の m_name メンバー変数の値を変更する必要があるとします。これを行うことができます:
const Person p; Person& pRef = const_cast<Person&>(p); // 将const对象转化为非const对象 pRef.setName("New Name"); // 调用setName函数修改成员变量的值
このアプローチは推奨されないことに注意してください。メンバー関数がオブジェクトの状態を変更する必要がある場合、この関数を呼び出すために const オブジェクトを使用することは避けるべきです。
つまり、C では const キーワードの使用に注意する必要があります。オブジェクトが const 宣言されている場合、そのメンバー関数も const 宣言されている必要があります。 「const オブジェクトでは非 const メンバー関数を呼び出すことはできません」というエラーが発生した場合は、メンバー関数がオブジェクトの状態を変更する必要があるかどうかを注意深く確認する必要があります。オブジェクトの状態を変更する必要がない場合は、メンバー関数を const として宣言する必要があります。メンバー関数がオブジェクトの状態を変更する必要がある場合、この関数を呼び出すために const オブジェクトを使用することは避けるべきです。
以上がC++ 構文エラー: const オブジェクトではない非 const メンバー関数を呼び出すことができません。どうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。