【发布时间】:2020-06-14 15:32:15
【问题描述】:
假设我有两个类,第一个:
class IntMatrix::iterator {
private:
const IntMatrix *int_matrix;
int index;
iterator(const IntMatrix *int_matrix, int index);
friend class IntMatrix;
public:
int &operator*() const;
iterator &operator++();
iterator operator++(int);
bool operator==(const iterator &it) const;
bool operator!=(const iterator &it) const;
iterator(const iterator &) = default;
iterator &operator=(const iterator &) = default;
~iterator() = default;
};
第二个是:
class IntMatrix::const_iterator {
private:
const IntMatrix *int_matrix;
int index;
const_iterator(const IntMatrix *int_matrix, int index);
friend class IntMatrix;
public:
const int &operator*() const;
const_iterator &operator++();
const_iterator operator++(int);
bool operator==(const const_iterator &it) const;
bool operator!=(const const_iterator &it) const;
const_iterator(const const_iterator &) = default;
const_iterator &operator=(const const_iterator &) = default;
~const_iterator() = default;
};
由于 99% 的实现是相同的,如何防止代码重复? 泛型在这里或继承有帮助吗?
如何实现的示例:
int &IntMatrix::iterator::operator*() const {
return int_matrix->data[index];
}
const int &IntMatrix::const_iterator::operator*() const {
return int_matrix->data[index];
}
另外,我希望在 main 中允许类似:
IntMatrix::iterator it;
更新: 我正在尝试通过以下方式在一个名为 Matrix 的通用类上实现给定的解决方案:(注意显示的代码在我的类中都是公开的)
template<typename T>
class iterator_impl;
template<typename T>
iterator_impl<T> begin(){
return iterator(this, 0);
}
template<typename T>
iterator_impl<T> end(){
return iterator(this, size());
}
template<typename T>
iterator_impl<const T> begin() const
{
return const_iterator(this, 0);
}
template<typename T>
iterator_impl<const T> end() const
{
return const_iterator(this, size());
}
template<typename T>
class iterator_impl{
private:
const Matrix<T> *matrix;
int index;
friend class Matrix<T>;
public:
iterator_impl(const iterator_impl &) = default;
iterator_impl &operator=(const iterator_impl &) = default;
~iterator_impl() = default;
iterator_impl(const Matrix<T> *int_matrix, int index)
: matrix(int_matrix), index(index) {}
iterator_impl &operator++()
{
++index;
return *this;
}
iterator_impl operator++(int)
{
iterator_impl result = *this;
++*this;
return result;
}
bool operator==(const iterator_impl &it) const
{
return index == it.index;
}
bool operator!=(const iterator_impl &it) const
{
return !(*this == it);
}
T &operator*() const {
if (index < 0 || index > matrix->size() - 1) {
throw Matrix<T>::AccessIllegalElement();
}
return matrix->data[index];
}
};
template<typename T>
using iterator = iterator_impl<T>;
template<typename T>
using const_iterator = iterator_impl<const T>;
我收到一些错误,例如:
在非静态成员函数之外无效使用“this” 返回迭代器(this, 0);
【问题讨论】:
-
@TedLyngmo 你能把它改成删除 IMT,这让我的事情变得非常复杂
-
我的 Matrix
类中的迭代器代码完全损坏,我没有备份 -
我不确定是否可以删除
IMT,因为您的迭代器要么指向const IntMatrix,要么指向非constIntMatrix。我现在改变了它,所以IMT被自动推导出来。 -
按原样编写代码给了我:非成员函数在编写时不能有'const'限定符:const_iterator begin() const;
-
您的代码适用于 intMatrix 而不是 Matrix
标签: c++ class generics methods iterator