【发布时间】:2019-10-09 12:59:16
【问题描述】:
我有一个虚拟容器“ISequence”,它用作数组或列表上容器实现的模板。我已经为 Array 和 List 容器实现了一个迭代器。我想做的是创建一个虚拟 IIterator 类,这样我就可以创建使用迭代器的算法并接受 ISequence 是一个参数。我的目标是免于执行。
我尝试将虚拟 IIterator 类添加到没有方法的 ISequence 并且继承了 std::iterator 但这不起作用
ISequence 类:
template <typename T>
class ISequence {
protected:
int length; //length of sequence
public:
virtual int getLength() const = 0; //get length of sequence
virtual bool getIsEmpty() const = 0; //check if empty
public:
virtual T get(int index) const = 0; //get item based on index
virtual T getFirst() const = 0; //get first item
virtual T getLast() const = 0; //get last item
virtual ISequence<T>* getSubSequence(int startIndex, int endIndex) const = 0;
virtual void append(T item) = 0; //add item to the end
virtual void prepend(T item) = 0; //add item to the beginning
virtual void insertAt(int index, T item) = 0; //insert item at a specific point
virtual void remove(T item) = 0; //remove specific item
virtual void replace(int index, T item) = 0; //replace an item
};
带有迭代器的数组:
template <typename T>
class ArraySequence: public ISequence<T> {
private:
T* data;
public:
ArraySequence();
ArraySequence(ISequence<T>* sequence);
ArraySequence(int n, int leftLimit, int rightLimit);
ArraySequence<T>& operator=(const ArraySequence<T>& sequence);
~ArraySequence();
public:
virtual int getLength() const override;
virtual bool getIsEmpty() const override;
public:
virtual T get(int index) const override;
virtual T getFirst() const override;
virtual T getLast() const override;
virtual ArraySequence<T>* getSubSequence(int startIndex, int endIndex) const override;
virtual void append(T item) override;
virtual void prepend(T item) override;
virtual void insertAt(int index, T item) override;
virtual void remove(T item) override;
virtual void replace(int index, T item) override;
private:
class MyIterator: public std::iterator<std::random_access_iterator_tag, T> {
friend class ArraySequence;
private:
T* pos;
MyIterator(T* pos);
public:
MyIterator(const MyIterator &it);
~MyIterator();
public:
typename MyIterator::reference operator*() const;
typename MyIterator::pointer operator->() const;
typename MyIterator::reference operator[](const typename MyIterator::difference_type& n) const;
typename MyIterator::difference_type operator-(const MyIterator& it) const;
MyIterator operator++(int);
MyIterator& operator++();
MyIterator operator--(int);
MyIterator& operator--();
MyIterator operator+(const typename MyIterator::difference_type& n) const;
MyIterator& operator+=(const typename MyIterator::difference_type& n);
MyIterator operator-(const typename MyIterator::difference_type& n) const;
MyIterator& operator-=(const typename MyIterator::difference_type& n);
bool operator!=(const MyIterator& it) const;
bool operator==(const MyIterator& it) const;
bool operator<(const MyIterator& it) const;
bool operator>(const MyIterator& it) const;
bool operator<=(const MyIterator& it) const;
bool operator>=(const MyIterator& it) const;
};
public:
typedef MyIterator iterator;
typedef MyIterator const const_iterator;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
};
我的抽象 IIterator 代码(作为 ISequence 的补充):
protected:
class IIterator: public std::iterator<std::random_access_iterator_tag, T> { //virtual Iterator class
};
public:
typedef IIterator iterator;
typedef IIterator const const_iterator;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
然后我通过 MyIterator in Array 继承它。
当我运行简单的forrange循环时,我得到了“二进制表达式的无效操作数('ISequence::IIterator'和'ISequence::IIterator')”错误消息。
【问题讨论】:
-
您没有提供确切的上下文,但我怀疑这是由于缺少
IIterator的比较运算符。附带说明一下,您可能需要重新考虑将const_iterator定义为const类型。 -
回答标题问题,是的。这正是
std::iterator所做的。 -
@sweenish
std::iterator不是虚拟的 -
你为什么要这样做?我根本不相信任何这些都需要做任何你想做的事情。关于这一点:请分享您真正想要实现的目标。显示您想到的将要使用它的代码。可以肯定的是,该代码可以在 C++ 中运行,而无需执行您建议的任何操作,并且它与 C#(或 Python)读起来并没有什么不同。