Передача объекта по константной ссылке означает, что мы не можем изменять ни одного из его членов. Но предположим, что объект содержит vector<string>
член. Как мы пишем const методы для чтения содержимого vector<string>
Член, предполагая, что vector<string>::iterator
элемент также необходим и должен обновляться после каждого чтения, чтобы указывать на следующий элемент в векторе?
Это возможно, или есть другой метод в этой ситуации? То есть не изменяйте содержимое передаваемого по const ссылочного объекта, но объект должен иметь возможность обновлять свое внутреннее состояние (то есть следующий элемент в векторе, который должен быть прочитан).
Похоже, вы ищете ключевое слово 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
,
Вот полный живой пример.
Если у вас есть член, который вы хотите изменить в const
методы — объявить их mutable
,
Не делайте этого: если вы хотите иметь семантику вроде first (), next (), last () для итерации контейнера, создайте прокси:
Proxy iteration() const { return Proxy(*this); }