Мое текущее задание - написать список с итераторами. Список представляет собой не столько проблему, сколько создание класса итератора.
Из нескольких источников я увидел, что у меня есть два оператора, которые нужно определить в моем классе итератора: оператор *
и оператор ->
.
Отлично! Предположим, что моя структура итератора такова
// 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? Если это так, то почему можно? t Я просто пишу
ListElem *operator->() { return pCurr_; }
вместо того, чтобы возвращать указатель? Насколько я понимаю, эти два оператора используются в моем списке (и, надеюсь, списках STL) таковы:
operator*() // Return data pointed to by iterator; pCurr_->data;
operator->() // Grant access to data-holding structure; pCurr;
Это правильно или что я не понимаю? (И есть ли у ->
собственное имя?)