2012-05-26 2 views
0

Я пытаюсь создать класс LinkedList с полиморфизмом и наследованием из файлов заголовков Stack и Queue. Это первый раз, когда я пытался использовать шаблоны, но продолжаю получать ошибки, например, «шаблон шаблона уже определен» или «абстрактный тип класса не разрешен». Как реализовать шаблон, поскольку я, очевидно, делаю это неправильно?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 и писать свои функции как автономный LinkedList :: FunctionName() в CPP файл с вне быть частью класса? – LF4

+0

@ LF4: Обычно это относится к обычным классам. При написании шаблонов вам необходимо определить свои функции в файле заголовка. Независимо от того, определены ли они в классе или вне класса, в основном это не имеет значения, за исключением того, что, когда определение находится вне класса, вы должны объявить его 'inline'. –

+0

Я включил обновленный код на то, что, я думаю, вы пытались объяснить. Думаю, мой вопрос в том, где/как я могу написать функцию класса шаблона? Все идет в шаблоне? Спасибо за помощь. – LF4

Смежные вопросы