使用迭代器封装实现的最佳方法

时间:2014-04-04 10:23:15

标签: c++ qt oop templates

我正在使用节点的QList开发Grpah类。每个节点包含一个相邻的QList。 能够循环遍历图的节点和每个节点的邻域肯定是有用的,但似乎有一个函数QList<Node*> getNodesQList<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(); 这是为什么?*


谢谢!

0 个答案:

没有答案