Как правильно вернуть ссылку на объект из итератора в C++

У меня проблемы с использованием ссылок на элементы std::vector в таком коде:

class CurrencyList {
public:
    Currency &append(wstring name);
private:
    vector<Currency> mCurrencyList;
};
Currency &CurrencyList::append(wstring name){
    vector<Currency>::iterator currency = findByName(name);
    if(currency != mCurrencyList.end()) 
        return *currency;
    mCurrencyList.push_back(Currency(name));
    return *mCurrencyList.rbegin();
}

Используется в этом коде:

Currency& BaseVal = currencyList.append("AAA");
Currency& ProfitVal = currencyList.append("BBB");
return new CurrencyPair(name, BaseVal, ProfitVal);

Когда я получаю ProfitVal во второй строке, значение BaseVal повреждено. Я думаю, что return *mCurrencyList.rbegin(); дайте мне ссылку на итератор, а не на элемент вектора. И затем это изменилось во втором вызове, первое значение было изменено. Как я должен использовать итератор и ссылки в этой ситуации?

1 ответ

Решение

Самое безопасное решение - вернуть копию Currency:

Currency append(const wstring& name)  // Note the return type.
{
    vector<Currency>::iterator currency = findByName(name);
    if(currency != mCurrencyList.end()) 
        return *currency;
    mCurrencyList.push_back(Currency(name));
    return *mCurrencyList.rbegin();
}

Обратите внимание, что ссылочный символ, &, был удален из подписи функции.

Другие вопросы по тегам