为自定义数组实现迭代器
Implementing iterator for custom array
我即将创建自己的可迭代泛型数组实现。我创建了一个名为 Iterable<E>
的接口,它将"强制"其所有继承者实现其所有纯虚拟方法。该界面具有以下原型:
可迭代
public:
virtual Iterable<E>& operator=(const Iterable<E>& iter) = 0;
virtual bool operator==(const Iterable<E>& iter) const = 0;
virtual bool operator!=(const Iterable<E>& iter) const = 0;
virtual Iterable<E>& operator++() = 0;
virtual E& operator*() = 0;
在我的Array<E>
中,我创建了以下方法:
Iterable<E> begin();
Iterable<E> end();
类 Array<E>
具有 Iterable<E>
的匿名嵌套实现,如下所示:
阵列迭代器
class ArrayIterator : public Iterable<E> {
public:
ArrayIterator(Array<E>* array, const int index) : _array(array), _index(index) {};
ArrayIterator& operator=(const ArrayIterator& iter) override { _index = iter._index; return *this; }
bool operator==(const ArrayIterator& iter) const override { return _index == iter._index; }
bool operator!=(const ArrayIterator& iter) const override { return _index != iter._index; }
ArrayIterator& operator++() override { _index++; return *this; }
E& operator*() override { return _array[_index]; }
private:
Array<E>* _array;
int _index;
};
然后,我将begin()
和end()
方法中的ArrayIterator
实例返回为:
Iterable<E> Array<E>::begin() {
return ArrayIterator(this, 0);
}
Iterable<E> Array<E>::end() {
return ArrayIterator(this, this->length()); //length() returns array size
}
一切都可以很好地编译,但是当我尝试为每个使用时,我会抛出一个编译时错误:"可迭代大炮可实例化抽象类">在以下示例中:
int main() {
Array<int> array{1, 2, 3, 4};
for(int i : array) { //<- error points to this line
}
}
正如Iterable
我返回ArrayIterator
它的实现,它不应该通过多态性工作吗?
您的begin
和end
函数都返回Iterable<E>
,而不是ArrayIterator
。 创建要返回的ArrayIterator
被切片,仅返回所创建对象的基部分。
由于这需要创建抽象类,因此会出现编译错误。
相关文章:
- 在文件上实现迭代器
- C++迭代器:实现迭代器类时出错
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 如何实现常量迭代器?
- 如何为我的容器实现随机访问迭代器?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 如何正确实现自动迭代器
- 了解迭代器/const_iterator实现
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 双向迭代器实现
- 链表迭代器实现C++
- 如何使用迭代器实现从序列的中间到开始的循环
- 如何为自定义模板化迭代器实现 std::d istance()
- 双链表迭代器实现的问题
- 迭代器实现 -(链表队列)
- std::sort 如何仅使用迭代器实现交换操作
- C++简单迭代器实现
- 迭代器实现问题
- get begin(VEC) / end(VEC)由它们之间的迭代器实现
- 自定义STL迭代器实现错误