Мое текущее назначение - написание списка с итераторами. Список не является проблемой, так как создание класса итератора.
Из нескольких источников я видел, что у меня есть два оператора для определения в моем классе итераторов: operator*
и operator->
.
Отлично, пока! Предположим, что моя структура итератора такова
// Nested class of List
class _Iter
{
private:
ListElem *pCurr;
const List *pList;
public:
_Iter(ListElem *pCurr, const List *list)
: pCurr_(pCurr), pList(list)
{}
T& operator*() { return pCurr_->data; }
T* operator->() { return &**this; }
};
с ListElem, равным
// Nested struct of List
struct ListElem
{
T data;
ListElem *next;
ListElem *prev;
};
Я вижу, что я делаю что-то в корне неправильно (поскольку двойное разыменование этого может привести к & (* pCurr _-> data), которое нельзя разыменовать.
Моя главная проблема - не понять, что -> на самом деле должно делать в этом случае. Должен ли он предоставить пользователю доступ к классу ListElem? Если это так, почему я не могу просто написать
ListElem *operator->() { return pCurr_; }
вместо возврата указателя? Мое понимание этих двух операторов, используемых в моем списке (и, надеюсь, списках STL), таково:
operator*() // Return data pointed to by iterator; pCurr_->data;
operator->() // Grant access to data-holding structure; pCurr;
Это правильно, или что я не получаю? (И имеет ли ->
собственное имя?)