2015-04-02 58 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++没有垃圾收集器),但它通常不是一个明智的方法。当然,这是否适用于您的情况取决于您的申请。但我的建议是学习迭代器和标准库算法。