我正在为列表类创建迭代器。迭代器有一个解引用运算符:
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?
真的在努力解决这个问题。谢谢!
答案 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;
}