Я пытаюсь создать класс 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;
};
Так что я должен реализовать свой шаблон в файле LinkedList.h и писать свои функции как автономный LinkedList :: FunctionName() в CPP файл с вне быть частью класса? – LF4
@ LF4: Обычно это относится к обычным классам. При написании шаблонов вам необходимо определить свои функции в файле заголовка. Независимо от того, определены ли они в классе или вне класса, в основном это не имеет значения, за исключением того, что, когда определение находится вне класса, вы должны объявить его 'inline'. –
Я включил обновленный код на то, что, я думаю, вы пытались объяснить. Думаю, мой вопрос в том, где/как я могу написать функцию класса шаблона? Все идет в шаблоне? Спасибо за помощь. – LF4