如何解决实现循环列表的迭代器
我正在尝试使用迭代器的嵌套类来实现一个循环列表类,我是这样写的:
template <class T>
class CircularList {
struct Item {
T data;
Item* next;
};
Item* head;
int size;
public:
CircularList() {
head = new Item();
head->next = head;
}
int sizeList() { return size; }
void push(T data) {
Item* i = new Item();
i->data = data;
i->next = head->next;
head->next = i;
size++;
}
class CircularListIterator {
Item* p;
CircularListIterator() {
p = head->next;
}
bool hasNext() {
if(p->next != head) {
return true;
}
return false;
}
T next() {
T data_temp = p->data;
p = p->next;
return data_temp;
}
};
CircularListIterator* iterator() {
return new CircularListIterator();
}
};
int main() {
CircularList<string>* letters = new CircularList<string>;
letters->push("d");
letters->push("c");
letters->push("b");
letters->push("a");
Iterator<string>* it= new Iterator<string>;
it = letters->iterator();
while (it->hasNext()) {
cout<< it->next() << "," << endl;
}
return 0;
}
但是当我尝试在主函数中创建迭代器时,迭代器不起作用,它说它没有在作用域中声明并且没有它的成员。
解决方法
假设“在主类中”是指 main
函数,问题很简单:您正在尝试构造一个 ::Iterator<string>
,但是在全局命名空间(或本代码示例中的其他任何地方)中没有名为 Iterator
!您可以尝试构造一个 CircularList<string>::CircularListIterator
- 这至少是一个存在的类 - 但它不起作用,因为迭代器需要与 CircularList
对象相关联才能访问成员变量,例如head
。
此处正确的做法是将 iterator
函数(返回 CircularListIterator*
的函数)从 CircularListIterator
类提升到 CircularList
类。然后,在您的 main
函数中,您可以调用 letters->iterator()
,它会为 CircularListIterator*
对象返回一个 letters
。
现在,CircularListIterator
不继承自任何其他迭代器类 - 您输入的 (nonexistent-in-this-code Iterator
) 和 C++ { {1}} 或其任何变体) - 因此您无法将其分配给 it
,甚至可能编译引用 std::iterator
的代码。要使 it
成为 Iterator
的子类,您需要使用适当的类别扩展 CircularListIterator
。有关 std::iterator
类模板的更多信息,包括实现它的示例,请参阅 https://www.cplusplus.com/reference/iterator/iterator/。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。