2016-12-04 58 views
0

我的任務是創建一個優先級隊列模板類,並使用不同的數據類型顯示其工作:int,string和任何結構。我必須添加,刪除,打印一個特定的元素。C++中的結構和模板類

的類是:

template< class Type > 
class PriorityList 
{ 
    private: 
    List<Type> elems; 

作爲一個結構我挑選是這樣的:

struct SOMESTRUCT 
{ 
    int num; 
    char word[]; 
}; 

據我所知一個模板類是可用於任何傳入數據類型的通用類。我可以看到如何爲int和char []創建類,但是如何使它對結構也起作用?既然你不能只寫cout < <結構,既不cin >> ...我不得不創建另一個函數輸入/輸出我的結構,但如果我把它放在我的模板類中,類不會是再次普遍。

我該怎麼辦?另外,我是否必須製作模板或只留下一個類型名稱?

+0

可能重複[如何正確重載ostream的<<運算符?](http://stackoverflow.com/questions/476272/how-to-properly-overload-the-operator-for-an-ostream ) – wally

+0

[This](https://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx)也可能有所幫助。 – wally

+0

嗯..謝謝你的選擇!但是,我還應該創建自己的Int和Char類,對吧?所以我可以寫模板,對吧? – Mary

回答

1

您可以使用

template<typename C> 
class PriorityList 
{ 
// ... 
}; 

任何類型C,包括intcharSOMESTRUCT。我建議不要在你的模板中使用cin和cout,因爲它使得它很難用於任何類。您需要爲每個課程使用overload operator<< and operator>>,這可能會非常棘手。

而應該定義一些簡單的成員函數。我會嘗試複製std::queue<T>的風格,因爲人們會熟悉它。

例如:

template<typename C> 
class PriorityQueue 
{ 
    public: 
    void push(const C& item, int priority=0){ 
    // ... 
    } 
    C& front(){ 
    // ... 
    } 
    // and other required functions 
}; 

一旦它被定義,你可以,但是你想測試一下不同類別。你可以例如創建main()以聲明PriorityQueue<int>,從std::cin中讀取一些int,然後調用您定義的那些函數,或者您可以聲明SOMESTRUCT的某些實例並將它們傳遞給PriorityQueue<SOMESTRUCT>

在一個真實的項目中,您可能會使用適當的單元測試框架,如catch用於此目的,它會自動檢查所有工作。