プライベートの非constおよびパブリックconstメンバー関数-平和的に共存していますか?
-
05-07-2019 - |
質問
私は、プライベートメンバーにアクセスするために使用される、同じ名前の2つのメソッドを持つクラスを作成しようとしています。 1つのメソッドはpublicでconst修飾され、もう1つのメソッドはprivateで非constです(参照による方法でメンバーを変更するためにフレンドクラスによって使用されます)。
残念ながら、コンパイルエラーが表示されます(g ++ 4.3を使用):非constオブジェクトを使用してメソッドを呼び出すと、g ++は、パブリック(const)バージョンであっても、非constバージョンのメソッドがプライベートであると文句を言います存在します。
プライベートな非constバージョンが存在しない場合、すべてが正常にコンパイルされるため、これは奇妙に思えます。
これを機能させる方法はありますか? 他のコンパイラーでコンパイルしますか?
ありがとう。
例:
class A
{
public:
A( int a = 0 ) : a_(a) {}
public:
int a() const { return a_; }
private:
int & a() { return a_; } /* Comment this out, everything works fine */
friend class B;
private:
int a_;
};
int main()
{
A a1;
A const a2;
cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails */
cout << a2.a() << endl; /* fine: uses the const version of a() */
}
解決
アクセスチェックの前にオーバーロードの解決が行われるため、非const Aでメソッドを呼び出すと、非constメンバーがより適切な一致として選択されます。コンパイラはアクセスチェックのために失敗します。
「この機能を使用する」方法はありません。プライベート関数の名前を変更することをお勧めします。プライベートアクセサーが必要ですか?
他のヒント
オブジェクトが const
として宣言されている場合は、 const
バージョンのみを選択します。そうでない場合は、非 const
バージョンを選択します(偶数エラーが発生した場合)。
これは動作するはずです:
cout << ((const A*)&a1)->a() << endl;
またはこれ:
A const& ra1 = a1;
cout << ra1.a() << endl;
所属していません StackOverflow