gpt4 book ai didi

c++ - 列表中 -> 运算符的语义(以及一般的 C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:17 25 4
gpt4 key购买 nike

我目前的任务是编写一个带有迭代器的列表。与创建迭代器类一样,列表不是问题。

从几个来源,我看到我有两个运算符要在我的迭代器类中定义: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;

这是正确的,还是我没有得到什么? (-> 是否有专有名称?)

最佳答案

无论你做什么,(*something).somethingElse 都应该等同于 something->somethingElse。后者只是前者的一个简短语法。因此,

T& operator*() { return pCurr_->data; }
T* operator->() { return &**this; }

很好,因为 *this 只是取消引用类型为 _Iter* 而不是 _Iterthis,所以没有完成 operator*() 调用。然后你解引用*this,所以你得到pCurr->data,然后你获取它的地址,所以你得到&pCurr->data。但是直接写会更清楚:

T& operator*() { return pCurr_->data; }
T* operator->() { return &pCurr->data; }

现在,这个

ListElem *operator->() { return pCurr_; }

是错误的,因为如果 operator*() 返回 T&operator->() 应该返回 T*,这就是它的设计目的。如果您真的想授予对 ListItem 而不是其数据的访问权限(这可能有意义,也可能没有意义,具体取决于设计,但在您的情况下,它看起来好像没有),那么您还应该重新定义 operator*( ) 得到这个:

ListElem& operator*() { return *pCurr_; }
ListElem *operator->() { return pCurr_; }

请注意,这不是语言要求,而是您如何设计类以避免混淆界面。

关于c++ - 列表中 -> 运算符的语义(以及一般的 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4483552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com