2015-05-28 57 views
0

我有一个接口的ICollection实现集合ArdalanCollection这样的:定制迭代器

template <typename T> 
class ICollection 
{ 
public: 
    virtual void add(T*) = 0; 
    virtual T* get(int) = 0; 
    virtual int count() = 0; 
}; 

template <typename T> 
class ArdalanCollection :public ICollection<T> 
{ 
public: 
    ArdalanCollection() { 
     index = 0; 
    }; 
    virtual void add(T* obj) { 
     encapsolateImplementation.insert(make_pair(index++, obj)); 
    }; 
    virtual T* get(int index) { 
     return encapsolateImplementation[index]; 
    }; 
    virtual int count() { 
     return encapsolateImplementation.size(); 
    }; 
private: 
    int index; 
    unordered_map < int, T* > encapsolateImplementation; 
}; 

我要的是有一个通用的迭代中ICollection的接口,可以循环中的所有通过内部容器元素(我还没有决定选择unordered_map作为我的内部容器,我可能会改变它来提升或其他)。我想以这种方式使用它:

Node *node1 = new Node(1, 0, 0, 0); 
    Node *node2 = new Node(1, 0, 0, 0); 
    ICollection<Node> *nodes = new ArdalanCollection<Node>(); 
    nodes->add(node1); 
    nodes->add(node2); 
    for (it=nodes->iterator.begin(); it < nodes->iterator.end(); it++) { 

    } 
+0

与虚拟功能混合模板是代码异味。 –

+0

与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或在[so]上签名。请参阅“[应该'嗨','谢谢',标语和致敬从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - 从帖子中删除)。顺便说一句,它是“提前致谢”,而不是“感谢先进”。 –

回答

0

首先您的for循环成语不正确。它更应像

for(auto it = nodes->begin(); it != nodes->end(); it++) 

然后沿东西:

template <typename T, typename MyMap> 
class ICollection 
{ 
public: 
    typedef typename MyMap<int, T *>::iterator iterator; 
    virtual void add(T*) = 0; 
    virtual T* get(int) = 0; 
    virtual int count() = 0; 
}; 

应该罚款。