2013-09-26 26 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(); 

隊列.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基本上,有序列容器(載體,雙端隊列,列表,等等)和適配器(堆棧,隊列等)。例如,堆棧使用任何序列容器來提供LIFO接口等。 –

+0

是的,我認爲這可以工作!在這種情況下,變量應該被實例化,每一個在它自己的類還是在basecontainer上? –

+0

ok nvm,我認爲這是我所需要的 非常感謝你! –