【发布时间】:2011-04-27 00:47:23
【问题描述】:
为了以快速灵活的方式使用数据遍历网格,我设置了一个抽象的模板化 GridDataStructure 类。数据应该由 STL 迭代器访问。当有人使用该类时,他不应该担心哪种 STL 迭代器适合特定的子类。
这个问题的解决方案似乎是Using Iterators to hide internal container and achieve generic operation over a base container。但是,我不明白为什么 begin() 和 end() 成员不再是虚拟的。除此之外,我不知道应该在哪里实现 STL 迭代器类的必要方法(如 operator++、operator* 等)。
请你看看我是否犯了设计错误?对我来说重要的是灵活的设计,但不以性能为代价。
我的班级设计:
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);
}
};
【问题讨论】: