列表中的 - >运算符的语义(通常是C++)

IAE*_*IAE 5 c++ iterator list operator-overloading

我目前的任务是用迭代器编写一个列表.列表不是一个问题,就像创建迭代器类一样.

从几个来源我看到我有两个运算符在我的迭代器类中定义: 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; }
};
Run Code Online (Sandbox Code Playgroud)

与ListElem一样

// Nested struct of List
struct ListElem
{
    T data;

    ListElem *next;
    ListElem *prev;
};
Run Code Online (Sandbox Code Playgroud)

我可以看到我做了大量错误的事情(因为双重解除引用会导致&(*pCurr _->数据),这是不可取消的.

我的主要问题是不了解 - >在这种情况下实际应该做什么.它应该授予用户访问ListElem类的权限吗?如果是这样的话,为什么我不能写

ListElem *operator->() { return pCurr_; }
Run Code Online (Sandbox Code Playgroud)

而不是返回一个指针?我对列表中使用的这两个运算符的理解(希望是STL列表)是:

operator*() // Return data pointed to by iterator; pCurr_->data;
operator->() // Grant access to data-holding structure; pCurr; 
Run Code Online (Sandbox Code Playgroud)

这是正确的,还是我没有得到什么?(确实->有一个合适的名字?)

Ser*_*nov 5

无论你做什么,(*something).somethingElse都应该相当于something->somethingElse.后者只是前者的短语法.因此,

T& operator*() { return pCurr_->data; }
T* operator->() { return &**this; }
Run Code Online (Sandbox Code Playgroud)

很好,因为*this只是this具有类型的取消引用_Iter*,而不是_Iter,所以没有进行任何operator*()调用.然后你取消引用*this,所以你得到pCurr->data,然后你拿它的地址,所以你得到&pCurr->数据.但是写下来会更清楚:

T& operator*() { return pCurr_->data; }
T* operator->() { return &pCurr->data; }
Run Code Online (Sandbox Code Playgroud)

现在,这个

ListElem *operator->() { return pCurr_; }
Run Code Online (Sandbox Code Playgroud)

是错误的,因为如果operator*()返回T&,operator->()应该返回T*,这就是它的设计目的.如果你真的想要授予对ListItem的访问权限而不是它的数据(根据设计可能会有意义,也可能没有意义,但在你的情况下看起来却没有),那么你还应该重新定义operator*()以获得:

ListElem& operator*() { return *pCurr_; }
ListElem *operator->() { return pCurr_; }
Run Code Online (Sandbox Code Playgroud)

请注意,它不是语言要求,它是您设计类以避免混淆接口的方式.