取消引用适用于ptr->运算符*(),但不适用于* ptr

时间:2017-11-15 19:45:08

标签: c++ operator-overloading dereference

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

    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
}

注释行说&#34;无效操作数到二进制experssion ostream和MyList :: iterator&#34;。同样,如果我从(* 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();

在这种情况下,我应该期待&#34; * list2&#34;与list1类似,与#34; * num2&#34;相同与num1类似? num2会调用dereferencer,还是尝试将MyList 转换为MyList?

真的在努力解决这个问题。谢谢!

2 个答案:

答案 0 :(得分: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->operator*()有效,因为->已经进行了第一次取消引用。它相当于(*ptr).operator*()

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

答案 1 :(得分:0)

你的循环完全错误。

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

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

cout << list_iter未定义为迭代器。您需要取消引用迭代器,以便输出所引用的数据:cout << *list_iter

cout << list_iter->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;
}