StrBlobPtr& operator++(); // префиксные операторы
StrBlobPtr& operator--();
//
};
Операторы инкремента и декремента работают подобным образом — они вызывают функцию check() для проверки допустимости объекта класса StrBlobPtr. Если это так, то функция check() проверяет также допустимость данного индекса. Если функция check() не передает исключения, эти операторы возвращают ссылку на свой объект.
В случае инкремента функции check() передается текущее значение curr. Пока это значение меньше размера основного вектора, функция check() завершается нормально. Если значение curr находится за концом вектора, функция check() передает исключение:
//
//
StrBlobPtr& StrBlobPtr::operator++() {
//
//
check(curr, "increment past end of StrBlobPtr");
++curr; //
return *this;
}
StrBlobPtr& StrBlobPtr::operator--() {
//
--curr; //
check(-1, "decrement past begin of StrBlobPtr");
return *this;
}
Оператор декремента уменьшает значение curr прежде, чем вызвать функцию check(). Таким образом, если значение curr (беззнаковое) уже является нулем, передаваемое функции check() значение будет наибольшим позитивным значением, представляющим недопустимый индекс (см. раздел 2.1.2).
При определении префиксных и постфиксных операторов возникает одна проблема: каждый из них имеет одинаковое имя и получает одинаковое количество параметров того же типа. При обычной перегрузке невозможно отличить префиксную и постфиксную версии оператора.
Для решения этой проблемы постфиксные версии получают дополнительный (неиспользуемый) параметр типа int. При использовании постфиксного оператора компилятор присваивает этому параметру аргумент 0. Хотя постфиксная функция вполне может использовать этот дополнительный параметр, как правило, так не поступают. Этот параметр не нужен для работы, обычно выполняемой постфиксным оператором. Его основная задача заключается в том, чтобы отличить определение постфиксной версии функции от префиксной.
Теперь в класс CheckedPtr можно добавить постфиксные операторы:
class StrBlobPtr {
public:
//
StrBlobPtr operator++(int); //
StrBlobPtr operator--(int);
//
};
Постфиксные версии должны запоминать текущее состояние объекта прежде, чем изменять объект:
//
//
StrBlobPtr StrBlobPtr::operator++(int) {
//
StrBlobPtr ret = *this; //
++*this; //
//
return ret; //
}
StrBlobPtr StrBlobPtr::operator--(int) {
//
StrBlobPtr ret = *this; //
--*this; //
//