我正在使用节点的QList开发Grpah类。每个节点包含一个相邻的QList。
能够循环遍历图的节点和每个节点的邻域肯定是有用的,但似乎有一个函数QList<Node*> getNodes
和QList<Node*> getAdjacent
不会很聪明(因为我会表明我使用的是QList)。
所以我决定为我的班级做一个迭代器。非常简单的实施:
template<class T>
class Graph {
private:
QList< Node<T>* > _nodes;
public:
typedef typename QList< Node<T>* >::const_iterator const_iterator;
typedef typename QList< Node<T>* >::iterator iterator;
iterator begin() {return _nodes.begin();}
const_iterator begin() const {return _nodes.begin();}
const_iterator cbegin() const {return _nodes.cbegin();}
const_iterator cend() const {return _nodes.cend();}
const_iterator constBegin() const {return _nodes.constBegin();}
const_iterator constEnd() const {return _nodes.constEnd();}
iterator end() {return _nodes.end();}
const_iterator end() const {return _nodes.end();}
Graph();
/*other methods*/
};
但是我的Node模板类的完全相同的代码。该代码有效,在我看来是个好主意。
所以我觉得有些混乱:
template<class T>
class Iterable {
protected:
T* _data;
public:
Iterable() {_data = new T();}
typedef typename T::const_iterator const_iterator;
typedef typename T::iterator iterator;
iterator begin() {return _data->begin();}
const_iterator begin() const {return _data->begin();}
const_iterator cbegin() const {return _data->cbegin();}
const_iterator cend() const {return _data->cend();}
const_iterator constBegin() const {return _data->constBegin();}
const_iterator constEnd() const {return _data->constEnd();}
iterator end() {return _data->end();}
const_iterator end() const {return _data->end();}
};
然后:
template<class T>
class Node : public Iterable< QList< Node<T>* > >{/*code*/};
template<class T>
class Graph : public Iterable< QList< Node<T>* > >{/*code*/};
这是最好的方法吗?因为它看起来很讨厌,虽然它完全重构了......
这部分是一个重复的问题。正如其他用户在评论中指出的那样,我将坚持一个问题:上面的问题。
*此外,现在我需要在尝试在图形或节点内部获取交互器类型时键入typename
,但不在外部。也就是说:
模板
void Graph :: example()const {
typename Graph :: const_iterator it;
//如果我删除typename,我会得到:error:在'Graph :: const_iterator'之前需要'typename',因为'Graph'是一个依赖范围
}
而我可以做的课外:
Graph :: iterator it = g.begin();
这是为什么?*
谢谢!