2012-05-26 31 views
0

我想創建LinkedList類與多態性和從堆棧和隊列頭文件繼承。這是我第一次嘗試使用模板,但不斷收到「類模板已被定義」或「不允許抽象類類型」之類的錯誤。我如何實現一個模板,因爲我顯然是不正確地做到這一點?具有多重繼承的C++ LinkedList模板?

// LinkedList.h File 
#include "Stack.h" 
#include "Queue.h" 
#include "Node.h" 

using namespace std; 

template <typename T> 
class LinkedList : public Queue<T>, public Stack<T> 
{ 
public: 
    LinkedList(); 
    ~LinkedList(void); 

protected: 
    Node<T> *first; 
    Node<T> *last; 
    int numItems; 
}; 

// LinkedList.cpp File 
#include "LinkedList.h" 

using namespace std; 

template <typename T> 
class LinkedList 
{ 
    LinkedList() 
    { 
     first = NULL; 
     last = NULL; 
     numItems = 0; 
    } 

    LinkedList::~LinkedList(void) 
    { 
     while (first != NULL) 
     { 
      Node* cur = first; 
      first = first->next; 
      delete cur; 
     } 
    } 

    LinkedList::clear() {}  
    LinkedList::size() {} 

    // Stack Functions 
    LinkedList::push(T item) {}  
    LinkedList::pop() {}  
    LinkedList::top() {} 

    // Queue Functions 
    LinkedList::enqueue(T item) {}  
    LinkedList::dequeue() {}  
    LinkedList::peek() {} 
} 

// Stack.h File (Queue is the same except push/pop/top = enqueue/dequeue/peek) 
#pragma once 

template <typename T> class Stack 
{ 

public: 

    virtual ~Stack() {} 

    virtual int size() = 0; 
    virtual void clear() = 0; 
    virtual void push(T item) = 0; 
    virtual T pop() = 0; 
    virtual T top() = 0; 

}; 

更新的代碼

// LinkedList.h File 
#pragma once 
#include "Stack.h" 
#include "Queue.h" 
#include "Node.h" 

template <typename T> 
class LinkedList : public Queue<T>, public Stack<T> 
{ 
public: 
    LinkedList(); 
    ~LinkedList(void); 

    void clear(); 
    int size(); 

    void push(T item); 
    T pop(); 
    T top(); 

    void enqueue(T item); 
    T dequeue(); 
    T peek(); 


protected: 
    Node<T> *first; 
    Node<T> *last; 
    int numItems; 
}; 

// LinkedList.cpp File 
#include "LinkedList.h" 

class LinkedList 
{ 
    LinkedList::LinkedList() 
    { 
     first = NULL; 
     last = NULL; 
     numItems = 0; 
    } 

    LinkedList::~LinkedList(void) 
    { 
     while (first != NULL) 
     { 
      Node* cur = first; 
      first = first->next; 
      delete cur; 
     } 
    } 

    LinkedList::clear(){} 
    LinkedList::size(){} 

    // Stack Functions 
    void LinkedList::push(T item){} 
    T LinkedList::pop(){} 
    T LinkedList::top(){} 

    // Queue Functions 
    void LinkedList::enqueue(T item){} 
    T LinkedList::dequeue(){} 
    T LinkedList::peek(){} 
} 


// Stack.h File (Queue is the same except push/pop/top = enqueue/dequeue/peek) 
#pragma once 

template <typename T> class Stack 
{ 

public: 

    virtual ~Stack() {} 

    virtual int size() = 0; 
    virtual void clear() = 0; 
    virtual void push(T item) = 0; 
    virtual T pop() = 0; 
    virtual T top() = 0; 

}; 

回答

1

我看到

// LinkedList.cpp File 

模板定義必須是每一個翻譯單元上可見,你不能把自己定義在一個CPP文件,並期望它的工作(就像它爲普通班級所做的那樣)。所有模板函數的定義應該出現在頭文件中。

此外,編譯器錯誤是正確的。您正在編寫兩個LinkedList類的定義。我假定你正在尋找:

LinkedList::LinkedList(){ ... } 
+0

所以,我要實現我的模板在LinkedList.h文件,並與出作爲一個階級的一部分CPP文件寫我作爲獨立的LinkedList ::使用functionName()? – LF4

+0

@ LF4:常規課程通常是這種情況。在編寫模板時,你需要在頭文件中定義你的函數。無論它們是在班級內還是班外定義的,大多都是無關緊要的,除非定義在班級之外時,您應該聲明它是「內聯」的。 –

+0

我已經包含了我認爲你想解釋的更新代碼。我想我的問題是在哪裏/如何編寫模板類的功能?這一切都在模板中?感謝您的幫助。 – LF4