Сохранение строки в перегруженных скобках без изменения поля объекта - PullRequest
0 голосов
/ 31 октября 2011

У меня есть проблема в моем коде, которую я не могу понять.Я хочу составить список списков и использовать его как двумерный ассоциативный массив.

Примерно так:

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 все равно не изменится.Я хочу спросить: почему?Может быть, итераторы возвращают копию этого объекта?Я не знаю.Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Ваша проблема в том, что operator[] возвращает значение TokenPair по значению, поэтому при назначении вы назначаете новое значение временному, а не объекту, сохраненному в списке.

Чтобы это работалоoperator[] должен возвращать ссылку на объект, который вы хотите изменить.

0 голосов
/ 01 ноября 2011

Вот пример использования карты-карт:

#include <map>
#include <string>
#include <iostream>
#include <sstream>

const char inputString[] =
  "President 16 Lincoln "
  "President 1 Washington "
  "State Best Illinois "
  "State Biggest Alaska ";
int main () {
  std::map<std::string, std::map<std::string, std::string> > token;
  std::string primary, secondary, result;
  std::istringstream input(inputString);
  while( input >> primary >> secondary >> result )
    token[primary][secondary] = result;
  std::cout << "Abe " << token["President"]["16"] << "\n";
  std::cout << "Springfield, " << token["State"]["Best"] << "\n";
  std::cout << "Blank: " << token["President"]["43"] << "\n";
}
...