0

クラスに 2 人のオペレーターがいることに少し問題があります。

私のクラスは宣言されています:

template <class keyType, class valueType>
class MyMap{

    keyType keys[MAX];
    valueType values[MAX];
    int size;
}

: を呼び出すときなど、演算子 [] を再​​定義する必要がありますstd::cout<<MyMap1["a"];

keyType& operator[] (keyType key){}

それは正常に動作します。私もそれを使って課題を作成しましたが、それは良かったです。例えば:MyMap1["a"]="a1";

コードは完璧でした。しかし、私はパラメーターoperator[]をインクリメントしsizeます。これは、割り当てを行いたい場合にのみ役立ちます。のみを行うときにインクリメントしたくありませんstd::cout

したがって、operator=関数を再定義する必要があるかもしれませんが、書き込めない場合:

void operator=(valueType value){}

の左のメンバーMyMap1["a"] = "a1"は akeyTypeであり、MyMap型ではないためです。

どのようにできるのか ?

4

5 に答える 5

1

あなたが書くとき:

auto blah = map[key];

operator[] は で呼び出されkey、値を返します。

あなたが書くとき:

map[key] = blah;

次に、 operator[key] が aで呼び出され、値が返されます。その後、引数を指定keyして値に対して operator= が呼び出されます。blah

これは、マップに対して実際に読み取りまたは書き込みを行っている場所を検出するのが難しい場合があることを意味します。

ただし、通常、読み取りの場合、ケースはvalue const& operator[] const呼び出されたものにフォールバックする可能性がありますが、書き込み中はvalue& operator[] constマーカーなしになります。したがって、const 指定子によって演算子をオーバーロードしようとする場合があります。2 つの operator[]s、1 つの const、1 つの非 const を提供し、後者でのみサイズをインクリメントします。

これは単純で簡単ですが、常に適切に機能するとは限りません。ある時点で誤って「operator [] as read」を呼び出す可能性がありますが、その時点でコンパイラによって決定可能な const 制約がありません。現時点では、いつ、どのように、それが可能であるかを正確に言うことはできませんが、consness に注意を払わなければ、非常に簡単にヒットできると思います。

それをヒットした場合、私が知っている唯一のオプションは、非 const モードで戻り値のラッパーを提供し、const モードでは通常のままにすることです。

myMap::valueType const & operator[](key...) const
mymap::wrapper<myMap::valueType>& operator[](key...)

ラッパーは Map への ref& を記憶し、KEY を記憶し、そのラッパーは暗黙的な変換 TO-valueType を提供し、代入演算子 FROM-valueType-TO-wrappertype を提供します。暗黙的な valuetype への変換は、指定されたキーからのマップからの読み取りを実行し、te カウンターをインクリメントしませんが、operator=(from-valuetype, to-wrappertype) はマップへの書き込みを実行します。

それは確かに機能しますが、このアプローチは時代遅れかもしれません。私は c'11 からの変更に精通していないので、より適切なオプションが利用できるようになった&& 可能性があります。

 valueType&& operator[](key)

も可能です----しかし、私にはわかりません。return-a-transparent-wrapper アプローチしか知りません。

編集: これは、読み取りと書き込みの両方をサポートし、これら 2 つを区別する適切な operator[] オーバーロードの素敵な (完全に見える) 例です。

stack: 添え字演算子に割り当てられた値を使用して何かを行う方法は?

于 2013-04-22T08:36:53.970 に答える
1

読み取り操作と書き込み操作を区別したい場合の解決策は、 からプロキシ オブジェクトを返すことoperator []です。

例については、https://stackoverflow.com/a/16132858/320726を参照してください。

于 2013-04-22T08:37:13.033 に答える