【问题标题】:Dereference works with ptr->operator*() but not with *ptr取消引用适用于 ptr->operator*() 但不适用于 *ptr
【发布时间】:2017-11-15 19:45:08
【问题描述】:

我正在为列表类创建一个迭代器。迭代器有一个解引用运算符:

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

在尝试使用迭代器时:

for( ; list->begin() != list->end; (*list_iter).operator++())
{
    cout << list_iter << endl;
    cout << list_iter->operator*() << endl;
    //cout << *list_iter << endl;  //not working
}

注释行说“二进制表达式 ostream 和 MyList::iterator 的操作数无效”。同样,如果我从 (*list_iter).operator++() 更改为 list_iter++ 或 (*list_iter)++,我会收到类似的错误。

我认为正在发生的事情是这样的:

int num1 = 3;
int *num2 = new int;
*num2 = 3;

在这种情况下,num1 == *num2... *num2 在功能上类似于 num1(两者都是整数),虽然 num2 是指向整数的指针,但 *num2 使它成为整数。

所以在:

MyList list1();
MyList *list2 = new MyList();

在这种情况下,我是否应该期望“*list2”与 list1 相似,就像“*num2”与 num1 相似一样? num2 会调用解引用器,还是尝试将 MyList 转换为 MyList?

真的很难理解这里发生的事情。谢谢!

【问题讨论】:

  • 我认为您需要包含一个小而完整的代码示例。从您发布的内容来看,目前尚不清楚出了什么问题。

标签: c++ operator-overloading dereference


【解决方案1】:

重载的operator* 只有在你直接在你定义它的类的对象上使用它时才会生效。它对指向此类对象的指针没有影响。如果您在指针上使用*,它只会将其取消引用到底层对象。额外的* 将调用重载的operator*

MyIterator *iter = new MyIterator();
*iter;  // This will only dereference the pointer.
**iter; // This will dereference the pointer and call your operator*.

在您的情况下,ptr-&gt;operator*() 有效,因为 -&gt; 已经进行了第一次取消引用。相当于(*ptr).operator*()

请注意,迭代器通常按值使用,您很少会在指针后面找到它们。

【讨论】:

    【解决方案2】:

    你的循环完全错误。

    begin() 迭代器未保存到 list_iter,而是直接与 end() 迭代器进行比较。因此,如果列表不为空,循环将永远运行。

    (*list_iter).operator++() 取消对迭代器的引用以访问其数据,然后对该数据而不是迭代器本身调用 operator++

    cout &lt;&lt; list_iter 没有为迭代器定义。您需要取消对迭代器的引用,以便输出被引用的数据:cout &lt;&lt; *list_iter

    cout &lt;&lt; list_iter-&gt;operator*() 取消对迭代器的引用以访问其数据,然后在该数据上调用operator*,而不是在迭代器本身上。

    您的循环应该看起来更像这样:

    for(list_iter = list->begin(); list_iter != list->end(); ++list_iter)
    {
        cout << *list_iter << endl;
    }
    

    或者,在 C++11 中,您可以改用 range-for loop 并让它为您处理迭代器:

    for(auto &data : *list)
    {
        cout << data << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 2013-05-18
      • 2021-11-11
      • 2022-01-13
      • 2013-12-20
      • 2020-08-07
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多