2016-10-26 19 views
-2

私は下付き演算子をオーバーライドしようとしているMapクラスの例があります。クラスのユーザーがマップを読み書きできるようにする。 ["a"]マップが読み込まれ、Map ["a"] = "something"がクラスの書き込みになります。しかし、私は物事の代入演算子側を使用する方法を理解できず、渡された値がそれを置き換えることを許可しません。私はそれだけで「セグメンテーションフォールト」ここ添字演算子のオーバーロード

読み込み、新しい値を代入しようとする今、私がこれまで持っているものです。

VALUE_TYPE& Map::operator[](KEY_TYPE a){ 
    cout << "hmm" << endl; 


} 



Map& Map::operator=(const Map &rhs){ 
    //cout << "operator = " << endl; 
} 

今、私は、コードのいずれかを持っていません...彼らはうまくいっていることを知りたかっただけです。私はセグメンテーションフォールトを取得します

Map["a"] = "hey"; 

ような何かをする場合、私は把握することができないよう何

です。私は、特定のキーに新しい値を代入したいときに代入演算子=が呼び出されると仮定していました。私は何か間違っているのですか?

ちなみに、VALUE_TYPEとKEY_TYPEは文字列として定義されているだけで、各キーには値が関連付けられています。

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

まず見てください。演算子は、 'マップ'の権利ではなく 'タイプ'を取っていなければなりませんか? 'Map [a]'はマップ内の要素を返すためです。地図ではありません。地図の地図でない限り。 –

+1

operator =は、単一の要素ではなく、マップ全体を割り当てます。 –

答えて

3

マップに割り当てているのではなく、operator[]によって返されたオブジェクトに割り当てています。
は(m["a"] = "hey";では、m["a"]は、それはVALUE_TYPE&だ、Mapではありません。)

オペレータは有効なオブジェクトへの参照を返す必要があり、そうでなければ動作は未定義です。

私が思い付くことができる最小の例:

struct Mapp 
{ 
    int& operator[](int i) { return member; } 
    int member; 
}; 

int main() 
{ 
    Mapp m; 
    m[0] = 12; // Assigns 12 to m.member 
} 

また、オペレータのconstのバージョンをオーバーロードします。

+0

うわー、それは意味があります...割り当てられるオブジェクトを返さなかった!ありがとうございました! –

関連する問題