1

私はintの周りに非常に単純な(今のところ)ラッパークラスを開発しようとしており、次のようなものを実現するために=演算子をオーバーロードすることを望んでいました:

class IntWrapper
{
    ...
    private:
        int val;
}

int main ( )
{
    IntWrapper a;
    int b;

    a = 5; // uses overloaded = to implement setter
    b = a; // uses overloaded = to implement getter
}

しかし、私はこれができないことを集めています。セッターの実装は非常に簡単で、次のようになります。

class IntWrapper
{
    ...
    IntWrapper& operator = (int rhs) { this.val = rhs; return *this; }
    ...
}

しかし、私が集めている少しのグーグルから、この方法でゲッターを行う方法はありません。私の理解では、これは=演算子は変数に割り当てるためにのみオーバーライドでき、 intはプリミティブ型であるため、デフォルトの=の実装をオーバーライドできないためです。これは正しいです?そうでない場合は、どうすればゲッターを作成できますか?

それが正しければ、誰かが似たようなものについて何かエレガントな提案がありますか?私が見つけることができる最も近いものは、変換演算子のオーバーロードです:

class IntWrapper
{
    ...
    operator int( ) { return this.val; }
    ...
}

int main ( )
{
    ...
    b = (int) a;
    ...
}

単純なgetVal()メソッドよりもほとんど優れていないので、私にはそれはかなり無意味に思えます。

提案をありがとう!

4

2 に答える 2

4

変換関数を呼び出すためにキャストは必要ありません。平野

b = a;

それも呼び出します。そうすれば、関数よりも使い勝手が良いことがわかりますgetVal。私は一般的に変換関数を使用しませんが。私は明示的なgetVal関数を好みます。特にこれを考慮してください

struct W {
  W(int);
  operator int();
};

int main() {
  W w = 42;
  int a = true ? 0 : w; // Ambiguity! What conversion direction?
}

それはすぐに手に負えなくなります...

于 2010-03-03T22:38:03.600 に答える
1

あなたが提案するのは行く道です、そして私はいつもそれを使います。aをintにキャストする必要はありません。コンパイラは、bがintであることを確認できるほど賢く、演算子intcast演算子を自動的に呼び出します。

于 2010-03-03T22:40:03.923 に答える