Семантика -> оператор в списках (и в целом C ++)

Мое текущее задание - написать список с итераторами. Список представляет собой не столько проблему, сколько создание класса итератора.

Из нескольких источников я увидел, что у меня есть два оператора, которые нужно определить в моем классе итератора: оператор * и оператор -> .

Отлично! Предположим, что моя структура итератора такова

// 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; 

Это правильно или что я не понимаю? (И есть ли у -> собственное имя?)

5
задан IAE 19 December 2010 в 15:20
поделиться