プライベートの非constおよびパブリックconstメンバー関数-平和的に共存していますか?

StackOverflow https://stackoverflow.com/questions/1201295

  •  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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top