2013-09-26 2 views
1

EI'm выполняет проект по классу структуры данных, который должен реализовывать различные типы структур.
Такие, как массивы, связанные, двунаправленные, круговые и т. Д.
Каждая из этих структур использует тип, стек, очередь или список.Наследие выбранных функций

Пример:
VectorStructure.h

template<typename T> 
class VectorStructure{ 
public: 
    int addOnPosition(T element, int pos); 
    int addOnBeginning(T element); 
    int add(T element); 
    int addElementOrdered(T element); 
    T removeFromPos(int pos); 
    T removeFromBeginning(); 
    T remove(); 
    T removeElement(T element); 
} 

Каждая реализация этих типов содержит код в точности так, как другие.
Стек: представляет собой структуру LIFO, использует только методы: add (элемент T) и remove();
Очередь: является структурой FIFO, использует только методы: add (элемент T) и removeFromBeginning();
Список: динамический массив, может использовать любой из этих методов и некоторые дополнительные функции.

Моя идея: Реализовать все эти функции в базовом классе и использовать эти типы только для необходимых методов базы. Я думал, что могу использовать наследование, но тогда стек мог получить доступ к недопустимой функции из базового класса, так как ее «дочерний» Также думал, что я могу использовать абстрактный класс, но для компиляции я должен реализовать все методы, содержащиеся в абстрактном класс.

типов (они только примеры, есть некоторые другие методы, которые являются одинаковыми для всех типов):
list.h

Stack.h

template<typename T> 
class Stack{ 
public: 
    int add(T element); 
    T remove(); 

Queue .h

template<typename T> 
class Queue{ 
public: 
    int add(T element); 
    T removeFromBeginning(); 

Есть ли способ реализовать эту идею?

ответ

1

Я не уверен, что правильно понял ваш вопрос, но я думаю, вы хотите избежать дублирования кода - как насчет передачи базовых типов контейнеров в качестве имен шаблонов шаблонов, например, STL с контейнерными адаптерами, такими как std::stack?

template<typename T> struct BaseContainer { 
    void push_front(T); 
    void push_back(T); 
    T pop_front(); 
    T pop_back(); 
}; 

template<typename T, typename TUnderlying = BaseContainer> class Stack { 
    TUnderlying baseContainer; 
    public: 
     void push(T item) { baseContainer.push_back(item); } 
     T pop() { return baseContainer.pop_back(); } 
}; 

template<typename T, typename TUnderlying = BaseContainer> class Queue { 
    TUnderlying baseContainer; 
    public: 
     void enqueue(T item) { baseContainer.push_back(item); } 
     T dequeue() { return baseContainer.pop_front(); } 
}; 
+0

Смотрите также: http://stackoverflow.com/questions/3873802/what-are-containers-adapters-c В принципе, есть контейнеры последовательность (вектор, Deque, список, и т.д.) и адаптеры (стек, очередь и т. д.). Например, стек использует любой контейнер последовательности для обеспечения интерфейса LIFO и т. Д. –

+0

да, я думаю, что это может сработать! в этом случае, где переменные должны быть инстанцированы, каждый в своем классе или на базовом контейнере? –

+0

ok nvm, я думаю, это то, что мне нужно спасибо вам большое! –

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