2015-04-02 148 views
-1

我想在C++中實現列表數據結構。C++模板接口(列表實現)

我想定義一個列表接口,這個列表接口稍後會被諸如ArrayList或LinkedList的實現繼承。

我希望能夠使用它像

List<int>* testList = new LinkedList<int>; 

所以我一直在努力,實現完整的虛擬模板類,但後來意識到我不能混淆虛擬和模板的方法。我嘗試了很多不同的方式,並一直遇到問題。

最好的辦法是做什麼?

編輯(有問題的代碼)。我試圖讓界面看起來像這樣:

template<typename T> 
class List { 
public: 
    virtual void add(T*) {}; 
    virtual void remove(unsigned int) = 0; 
    virtual unsigned int size() = 0; 
    virtual void get(unsigned int) = 0; 

    virtual ~List(); 
}; 

,然後即時試圖在這裏實現它:

template<typename T> 
class LinkedList : public List<T> { 
/* some stuff */ 
public: 
    LinkedList(); 

    virtual unsigned int size(); 
    virtual void add(T*); // the problem i guess 
    virtual void remove(unsigned int); 
    virtual void get(unsigned int); 

    virtual ~LinkedList(); 
}; 
+2

你不應該爲此需要虛擬函數的模板,整個接口/類的模板應該足夠了。你能展示給你帶來麻煩的代碼嗎? – Angew 2015-04-02 12:56:49

+0

請提供有問題的源代碼的一部分。您不能混用虛擬方法和模板方法,但可以在模板類中使用虛擬方法。這應該滿足您的需求。 – Spook 2015-04-02 12:56:53

+1

請不要。 'std :: vector','std :: list'。不要在C++中執行Java。 – Griwes 2015-04-02 13:00:48

回答

0

所以我一直在努力,實現完整的虛擬模板類,但隨後 實現我不能混合虛擬和模板ed方法。

您的示例代碼指出,您不需要虛擬模板化方法,而是需要具有虛擬方法的模板類。前者是不允許的,後者是(這是混淆的共同點)。

所以這是完全合法的代碼:

#include <iostream> 
#include <memory> 

template<class T> 
class List{ 
public: 
    virtual void push()=0; 
    virtual void pop()=0; 
    virtual ~List()=default; 
}; 

template<class T> 
class LinkedList: public List<T>{ 
public: 
    virtual void push() { 
     std::cout << "Pushed element to Linked List"<< std::endl; 
    } 
    virtual void pop() { 
     std::cout << "Poped element from Linked List"<< std::endl; 
    } 
}; 

template<class T> 
class ArrayList: public List<T>{ 
public: 
    virtual void push() { 
     std::cout << "Pushed element to ArrayList"<< std::endl; 
    } 
    virtual void pop() { 
     std::cout << "Poped element from ArrayList"<< std::endl; 
    } 
}; 

int main() 
{ 

    List<int>* list1=new LinkedList<int>(); 
    List<int>* list2=new ArrayList<int>(); 
    // And this is how you would actually create objects on the heap nower days: 
    std::unique_ptr<List<int>> list3=std::make_unique<LinkedList<int>>(); 

    list1->push(); 
    list2->push(); 
    list3->push(); 

    list1->pop(); 
    list2->pop(); 
    list3->pop(); 

    delete(list1); 
    delete(list2); 
    //no delete(list3) needed 
    return 0; 
} 

除此之外,我不知道,你爲什麼要這麼做。 C++有一個鏈接列表和一個數組/矢量的實現的完美實現,並且基於基於迭代器的語義,您可以在其上運行(幾乎)任何算法,而不需要公共基類。

我很抱歉,如果這聽起來很刺耳,但看起來您正在從Java中學習並嘗試學習C++。但不是學習C++,而是嘗試編寫包裝器,使C++看起來像java。雖然這在大多數情況下都是可行的(只要你不要忘記,標準C++沒有垃圾收集器),但它通常不是一個明智的方法。當然,這是否適用於您的情況取決於您的申請。但我的建議是學習迭代器和標準庫算法。