2017-04-22 69 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;  

这取决于您的需求。