为自定义数组实现迭代器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为自定义数组实现迭代器相关的知识,希望对你有一定的参考价值。
我即将创建自己的可迭代通用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();
类qazxsw poi有qazxsw poi的匿名嵌套实现,它看起来如下:
ArrayIterator
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;
};
方法中返回ArrayIterator
实例:
begin()
一切都编译得很好,但是当我尝试使用每个时,我会抛出一个编译时错误:'Iterable cannon instantiable abstract class'在下面的例子中:
end()
作为 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>
被切片,只返回创建的对象的基本部分。
由于这需要创建抽象类,因此会出现编译错误。
以上是关于为自定义数组实现迭代器的主要内容,如果未能解决你的问题,请参考以下文章