Я пытаюсь создать интерфейс Matrix. Этот класс будет реализован двумя классами. Один из них называется RegMatrix (Regular Matrix). Теперь я пытаюсь создать итераторы для классов RegMatrix и OthMatrix, и пусть пользователь сможет перебирать объект «Матрица». Проблема в том, что я получаю сообщение об ошибке «неверный тип возвращаемого значения для виртуального RegMatrix :: iterator RegMatrix :: begin()» для методов begin() и end(), вероятно, потому что один из них возвращает RegMatrix :: iterator, а базовый возвращает Matrix :: iterator. Я не понимаю, что на самом деле не так. Кто-нибудь знает, как исправить эту проблему? Спасибо.Ошибка «неверный код возвращаемого типа» в вложенных итераторах и inteface
Редактировать: Я понимаю, что из ваших текущих ответов мой дизайн недействителен. Итак, может ли кто-нибудь предложить лучший дизайн/решение для моей проблемы? итерация по «Матрице», которая может быть либо вложением «RegMatrix» (реализована с помощью карты для хранения данных), либо экземпляром «OthMatrix» (реализована с помощью Vector). эти два имеют разные итераторы, и я хочу, чтобы итератор Wrapper обертывал эти два, так что экземпляр будет прозрачным для пользователя при итерации. Благодарю.
класса Matrix (интерфейс):
class Matrix
{
public:
class iterator
{
public:
virtual iterator& operator=(const iterator &other);
virtual ~iterator(){}
double operator*() const;
bool operator==(const iterator &other) const;
bool operator!=(const iterator &other) const;
iterator &operator++();
iterator &operator++(int);
};
virtual iterator begin() = 0; //*** ERROR : overriding 'virtual Matrix::iterator Matrix::begin()' ***
virtual iterator end() = 0; //*** ERROR : overriding 'virtual Matrix::iterator Matrix::end()' ***
};
Класс Regular матрица:
class RegMatrix : public Matrix
{
public:
RegMatrix() {//TODO };
class iterator : public Matrix::iterator{
friend class RegMatrix;
public:
iterator& operator=(const iterator &other) {
//TODO
}
~iterator() {}
double operator*() const {
//TODO
}
bool operator==(const iterator &other) const {
//TODO
}
bool operator!=(const iterator &other) const {
//TODO
}
iterator &operator++() {
//TODO
}
iterator &operator++(int)
{
//TODO
}
iterator(Vector2D::iterator place)
{
rowIter = place;
}
private:
Vector2D::iterator rowIter;
Vector::iterator colIter;
};
iterator begin() { //*** ERROR : invalid covariant return type for 'virtual RegMatrix::iterator RegMatrix::begin()' *** //
return iterator(matrix.begin());
}
iterator end() { //*** ERROR : invalid covariant return type for 'virtual RegMatrix::iterator RegMatrix::end()' *** //
return iterator(matrix.end());
}
private:
Vector2D matrix;
};
Чтобы решить синтаксическую ошибку, вы не можете вернуть указатель или ссылку. Но вы можете видеть, есть еще одна проблема. Я думаю, вы должны пересмотреть свой дизайн. – wuqiang
Я понимаю. так, может ли кто-нибудь предложить лучший дизайн/решение для моей проблемы? итерация по «Матрице», которая может быть либо вложением «RegMatrix» (реализована с помощью карты для хранения данных), либо экземпляром «OthMatrix» (реализована с помощью Vector). эти два имеют разные итераторы, и я хочу, чтобы итератор Wrapper обертывал эти два, так что экземпляр будет прозрачным для пользователя при итерации. Благодарю. – user2630165
См. Мой отредактированный ответ для альтернативного подхода к дизайну. – Horstling