Как изменить / обновить внутреннее состояние объекта, переданного по константной ссылке

Передача объекта по константной ссылке означает, что мы не можем изменять ни одного из его членов. Но предположим, что объект содержит vector<string> член. Как мы пишем const методы для чтения содержимого vector<string> Член, предполагая, что vector<string>::iterator элемент также необходим и должен обновляться после каждого чтения, чтобы указывать на следующий элемент в векторе?

Это возможно, или есть другой метод в этой ситуации? То есть не изменяйте содержимое передаваемого по const ссылочного объекта, но объект должен иметь возможность обновлять свое внутреннее состояние (то есть следующий элемент в векторе, который должен быть прочитан).

1

Решение

Похоже, вы ищете ключевое слово mutable, Изменяемая переменная-член может быть изменена в пределах const член метод. Вы можете прочитать об этом Вот. Пример:

class A
{
std::vector< int > v_;
mutable std::vector< int >::const_iterator current_;

public:
int get() const // note the const
{
assert( !v_.empty() );
if( current_ == v_.end() ) current_ = v_.begin();
return *current_++;
}
};

Обратите внимание, что вам все еще нужно const_iterator поскольку сам вектор является константой и, следовательно, v_.begin() не дает вам нормального итератора. Вы мог исправить это, отметив сам вектор также как mutableтогда вы могли бы использовать iterator,

Вот полный живой пример.

2

Другие решения

Если у вас есть член, который вы хотите изменить в const методы — объявить их mutable,

1

Не делайте этого: если вы хотите иметь семантику вроде first (), next (), last () для итерации контейнера, создайте прокси:

Proxy iteration() const { return Proxy(*this); }
0
По вопросам рекламы [email protected]