2017-04-22 44 views
2

我有一個通用類Queue,它包含一個模板Ttype2作爲將存儲在每個節點的信息字段中的數據類型的展示位置持有者。 在我的驅動程序類中,我想實例化一個Queue類對象的數組,但我似乎無法弄清楚。我該如何去做這件事?通用類對象數組C++

這些沒有工作,但說明了什麼,我試圖完成:

// Queue Complex[] = new Queue();//invalid use of template name without identifier list 
//Queue<Ttype2> Complex[]; //template arg 1 is invalid 
// vector<Queue> Complex2[];//invalid template arguments` 

Queue.h水箱內隊列類聲明和構造函數:

template <typename Ttype2> 
class Queue 
{ 
    // Global Data Items 
    protected: 
    Node <Ttype2> Front, Rear; 
    int Length; 

    // member function prototypes 
    public: 
    Queue(); 
    void AddRear(Node <Ttype2> ThisNode); 
    Node <Ttype2> RemoveFront(); 
    void Modify(int Position, Node <Ttype2> ThisNode); 
    void ClearAll(); 
    int GetSize();` 
    Node <Ttype2> GetNode(int Position); 
    Node <Ttype2>* toArray(); 
};` 

// Constructor 
template <typename Ttype2> 
Queue <Ttype2> :: Queue() 
{ 
    Rear = Front = NULL; 
    Length = 0; 
} // End of Constructor 
` 
+0

我是否需要實現一個通用數組類來容納這些通用對象? – user3412695

回答

0

這工作:

Queue<int> *Complex = new Queue<int>(); 
Queue<int> Complex[1]; 
vector<Queue<int>> Complex2[1]; 

實例化時,您需要爲模板提供真實的參數。

Queue<Ttype2> // Ttype2 isn't a real type, use int, char, ... 

你也需要定義你的類型Node<>。如果你想分配NULLRearFront它,首先考慮讓他們指針,第二個使用nullptr而不是NULL

0

我將增加約拉的解決方案,如果我想保留許多不同Queue<XXX>在單個陣列中,
我通常創建一個接口類Queue_base

class Queue_base{ 
    public: virtual void func()=0; 
}; 

template <typename Ttype2>class Queue : public Queue_base{ 
    public: void func(){ 
     //... some code 
    } 
}; 

int main() { 
    Queue_base* complex[2]; 
    complex[0]=new Queue<int>(); 
    complex[1]=new Queue<float>(); 
    complex[0]->func(); 
    std::vector<Queue_base*> complex2; 
    complex2.push_back(new Queue<char>()); 
    Queue<int>* c1=static_cast<Queue<int>*>(complex[0]); 
    return 0; 
} 

這裏是生活demo
請注意,使用虛擬功能會降低性能。

它也會丟失類型(減少到Queue_base*)並限制某些函數調用,但它對於某些實際情況非常有用。

爲擴展其用法,Node<T>也可以繼承於具有Node<T>的所有常見功能的新類Node_Base,例如, : -

template <typename Ttype2> class Queue : public Queue_Base{ 
    // Global Data Items 
    protected: 
    Node_Base* Front; //Front = new Node<Ttype2>(); 
    Node_Base* Rear;  

這取決於您的需求。