Привет всем, это ОП на альтернативном аккаунте.
НАЗНАЧЕНИЕ
Написать универсальное семейство классов итераторов, которое будет способно перебирать std :: vectors и массивы T [], где T = byte = unsigned char.
ИДЕЯ ЗА АБСТРАКТНЫМ КЛАССОМ
Идея заключалась в том, чтобы использовать базовый абстрактный класс для интерфейсов функций, чтобы все функции имели общий тип. Следующий абстрактный класс заставляет все дочерние классы использовать следующие операторы:
** У меня нет компилятора со мной, поэтому, пожалуйста, прости меня за любые ошибки **
class iterator
{
public :
virtual iterator & operator -- () = 0;
virtual iterator & operator -- (int) = 0;
virtual iterator & operator ++ () = 0;
virtual iterator & operator ++ (int) = 0;
virtual iterator & operator += (int n) = 0;
virtual iterator & operator -= (int n) = 0;
virtual bool operator == (const iterator & o) = 0;
virtual bool operator != (const iterator & o) = 0;
};
Итак, пример производного класса будет выглядеть так:
/*! \brief ptr iterator can be used to iterate over classic c-style arrays */
class ptr_iterator : public iterator
{
public :
ptr_iterator() : m_p(NULL) {}
ptr_iterator(byte * b) : m_p(b) {}
iterator & operator = (const ptr_iterator &o)
{ m_p = o.m_p; return *this; }
iterator & operator = (byte * b)
{ m_p = b; return *this; }
virtual iterator & operator -- ()
{ --m_p; return *this; }
virtual iterator & operator -- (int)
{ m_p--; return *this; }
virtual iterator & operator ++ ()
{ ++m_p; return *this; }
virtual iterator & operator ++ ()
{ m_p++; return *this; }
virtual iterator & operator += (int n)
{ m_p += n; return *this; }
virtual iterator & operator -= (int n)
{ m_p -= n; return *this; }
virtual bool operator == (const iterator & o)
{ return ((ptr_iterator*)&o)->m_p == m_p; }
virtual bool operator != (const iterator & o)
{ return ((ptr_iterator*)&o)->m_p != m_p; }
private :
byte * m_p;
};
Помимо вышеупомянутого итератора, у нас может быть итератор, который будет перебирать std :: vector
шаблон
класс std_iterator: публичный итератор
{
typedef имя типа C :: iterator c_iterator;
общественность:
iterator & operator = (const c_iterator & i)
{m_it = я; вернуть * это; }
iterator & operator = (const std_iterator & o)
{m_it = o.m_it; вернуть * это; } * * Тысяча двадцать-один
virtual iterator & operator ++ ()
{ ++m_it; return *this; }
virtual iterator & operator ++ (int)
{ m_it++; return *this; }
virtual iterator & operator -- ()
{ --m_it; return *this; }
virtual iterator & operator -- (int)
{ m_it--; return *this; }
virtual iterator & operator += (int n)
{ m_it += n; return *this; }
virtual iterator & operator -= (int n)
{ m_it -= n; return *this; }
virtual bool operator == (const iterator &o)
{ return ((std_iterator*)&o)->m_it == m_it; }
virtual bool operator != (const iterator &o)
{ return ((std_iterator*)&o)->m_it != m_it; }
bool operator == (const c_iterator &i)
{ return m_it == i; }
bool operator != (const c_iterator &i)
{ return m_it != i; }
личное:
c_iterator m_it;
}; * 1 027 *
Хорошо, так что в основном вышеупомянутые итераторы способны выполнять итерации по массиву или вектору.
если бы мы использовали функцию со следующим интерфейсом:
int DoStuff(iterator &it);
Все виды итераторов могли бы вызывать его - и это общая идея. Допустим, я имею дело с данными, поступающими в разных формах - от массивов до векторов:)
Дело в том, что мне нужны следующие функции:
std_iterator> it = my_vector.begin (); // ЭТО ОДИН РАБОТАЕТ
std_iterator> other = it; // ЭТО ОДИН РАБОТАЕТ СЛИШКОМ
Если бы я был внутри вышеупомянутой функции
int DoStuff(iterator &it)
{
iterator a = it + 2; // THIS IS ILLEGAL DUE TO ABSTRACT-NESS OF THE BASE CLASS
// YET I STILL NEED THIS TO WORK. HOW DO I ACHIEVE THAT ?
// DO I SACRIFICE THE ABSTRACT-NESS OF THE BASE CLASS ?
// AT THIS POINT I WAS SERIOUSLY CONSIDERING AN OVERLOAD OF THE
// + OPERATOR BUT HAVE NO IDEA HOW TO DO IT WITH AN ABSTRACT
// CLASS
// (...)
return 0;
}