У меня есть проблема в моем коде, которую я не могу понять.Я хочу составить список списков и использовать его как двумерный ассоциативный массив.
Примерно так:
token["window"]["title"] = "Amazing!";
cout << token["window"]["title"]; //Amazing!
Вторая строка работает хорошо.Данные считываются из файла.Проблема с первой инструкцией.
Вот как я перегружаю секундные квадратные скобки:
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 = переменная newValue == "Ok" и после первой строки даже значение установлено на «Ok»;Но когда я позже сделаю:
cout << token["window"]["title"] ;
поле в TokenPair все равно не изменится.Я хочу спросить: почему?Может быть, итераторы возвращают копию этого объекта?Я не знаю.Пожалуйста, помогите.