コードに理解できない問題があります。リストのリストを作って二次元連想配列のように使いたい。
このようなもの:
token["window"]["title"] = "Amazing!";
cout << token["window"]["title"]; //Amazing!
2行目はうまくいきます。データはファイルから読み取られます。問題は最初の指示にあります。
これは、 2番目の角括弧をオーバーロードする方法です:
TokenPair Token::operator[](string keyName){
for( list<TokenPair>::iterator pair=keys.begin(); pair != keys.end();++pair){
if(pair->key == keyName){
return *pair;
}
}
}
ご覧のとおり、クラス TokenPair のオブジェクトを返します。オブジェクト (フィールド TokenPair::value) から値を適切に取得するには、string() でストリーミングとキャストをオーバーロードします。
TokenPair::operator string() const{
return value;
}
ostream & operator<< (ostream &stream, const TokenPair &pair){
return stream << pair.value;
}
そして、価値を得る前に私が言うように、うまくいきます。問題は、属性の演算子のオーバーロードにあります:
TokenPair TokenPair::operator=( const string newValue ){
value = newValue;
return *this;
}
このメソッドは値を割り当てますが、それを覚えていません! 例えば:
token["window"]["title"] = "Ok";
メソッド内で TokenPair::operator= variable newValue=="Ok"が発生し、最初の行の後でも値が "Ok" に設定されます。しかし、後で行うとき:
cout << token["window"]["title"] ;
TokenPair のフィールドはまだ変更されていません。私は尋ねたい:なぜですか?イテレータはそのオブジェクトのコピーを返すのでしょうか? 知らない。助けてください。