Для быстрого и гибкого обхода сеток с данными я создал абстрактный шаблонный класс GridDataStructure. Данные должны быть доступны для итераторов STL. Когда кто-то использует класс, он не должен беспокоиться о том, какой тип STL-итератора подходит для определенного подкласса.
Решением этой проблемы является Использование итераторов для скрытия внутреннего контейнера и выполнения общей операции над базовым контейнером . Однако я не понимаю, почему члены begin () и end () больше не являются виртуальными. Кроме того, я не мог понять, где именно должны быть реализованы необходимые методы для класса итераторов STL (например, оператор ++, оператор * и т. Д.).
Не могли бы вы посмотреть, сделал ли я ошибку в дизайне или нет? Для меня важен гибкий дизайн, но не за счет производительности.
Мой класс дизайна:
template<class T>
class GridDataStructure
{
public:
virtual iterator begin() = 0;
virtual iterator end() = 0;
};
template<class T>
class GridDataUniform : GridDataStructure
{
public:
GridDataUniform(int size);
iterator begin();
iterator end();
class iterator : public std::iterator<std::forward_iterator_tag, T> {
public:
iterator(Node* p) : node_(p) {}
~iterator() {}
iterator& operator=(const iterator& other);
bool operator==(const iterator& other);
bool operator!=(const iterator& other);
iterator& operator++();
iterator& operator++(int);
T& operator*();
T* operator->();
private:
Node* node_;
};
private:
T* griddata;
};
Я хотел бы получить доступ к своему сеточному контейнеру в стиле STL, например:
GridDataStructure<int>::iterator = someGrid->begin(); // where someGrid is an instance of GridDataUniform
std::cout << *(iter) << std::endl;
Любая помощь высоко ценится.
Редактировать (19.10.10): добавлен вложенный класс итераторов
Редактировать (20.10.10): Добавлен код:
template<class T>
class GridDataStructureBase
{
protected:
class BaseIteratorImpl
{
virtual iterator begin() = 0;
virtual iterator end() = 0;
virtual iterator& operator++() = 0;
}
public:
class iterator : std::iterator<std::forward_iterator_tag, T>
{
public:
iterator(const BaseIteratorImpl& itImpl) {}
iterator begin() { return itImpl->begin(); }
iterator end() { return itImpl->end(); }
iterator& operator++() { return itImpl->operator++() }
private:
BaseIteratorImpl* itImpl;
};
iterator begin()
{
iterator* i = new iterator(??);
return i->begin();
}
iterator end()
{
return iterator(NULL);
}
};