Необходимо использовать Повышение. Итераторы. Это содержит много шаблонов и понятий для реализации новых итераторов и адаптеров для существующих итераторов. Я записал статья об этой самой теме ; это находится в журнале ACCU в декабре 2008. Это обсуждает изящное решение (IMO) для точно Вашей проблемы: представление членских наборов от объекта, с помощью Повышения. Итераторы.
, Если Вы хотите использовать stl только, , книга Josuttis имеет главу по реализации Ваших собственных итераторов STL.
/ РЕДАКТИРОВАНИЕ: Я вижу, собственный итератор на самом деле необходим здесь (я неправильно читал вопрос сначала). Однако, я позволяю коду ниже стенда, потому что это может быть полезно при подобных обстоятельствах.
<час>собственный итератор, на самом деле необходимый здесь? Возможно, достаточно передать все необходимые определения контейнеру, содержащему реальные точки:
// Your class `Piece`
class Piece {
private:
Shape m_shape;
public:
typedef std::vector<Point>::iterator iterator;
typedef std::vector<Point>::const_iterator const_iterator;
iterator begin() { return m_shape.container.begin(); }
const_iterator begin() const { return m_shape.container.begin(); }
iterator end() { return m_shape.container.end(); }
const_iterator end() const { return m_shape.const_container.end(); }
}
Это предполагает, что Вы используете vector
внутренне, но тип может легко быть адаптирован.
Решением Вашей проблемы не является создание Ваших собственных итераторов, но использование существующих контейнеров STL и итераторов. Сохраните точки в каждой форме в контейнере как вектор.
class Shape {
private:
vector <Point> points;
то, Что Вы делаете с тех пор, зависит от Вашего дизайна. Лучший подход должен выполнить итерации через точки в методах в Форме.
for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
/* ... */
, Если Вам нужно к точкам доступа вне Формы (это могло бы быть меткой несовершенного дизайна) можно создать в методах Формы, которые возвратятся, функции доступа итератора для точек (в этом случае также создают общедоступное определение типа для контейнера точек). Посмотрите на ответ Konrad Rudolph для деталей этого подхода.
Можно считать этот ddj статья
В основном, наследоваться станд.:: итератор для получения большей части работы, сделанной для Вас.
Здесь Проектирование STL-подобного пользовательского контейнера - отличная статья, в которой объясняются некоторые основные понятия о том, как можно создать класс контейнера, подобный STL, и класс итератора для него. Обратный итератор (немного сложнее), хотя и оставлен в качестве упражнения: -)
HTH,