2015-05-28 56 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; 
}; 

應該罰款。