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)
这是正确的,还是我没有得到什么?(确实->有一个合适的名字?)
无论你做什么,(*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)
请注意,它不是语言要求,它是您设计类以避免混淆接口的方式.
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |