实现循环列表的迭代器

问题描述

我正在尝试使用迭代器的嵌套类来实现一个循环列表类,我是这样写的:

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/