我有一个通用类Queue
,它包含一个模板Ttype2
,作为将存储在每个节点的信息字段中的数据类型的放置持有者。
在我的驱动程序类中,我想实例化一个Queue
类对象的数组,但我似乎无法弄明白。我该怎么做呢?
这些没有用,但说明了我想要完成的事情:
// 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 :(得分: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<>
。如果您想将NULL
分配给Rear
和Front
,请先考虑将它们作为指针,然后再使用nullptr
代替NULL
。
答案 1 :(得分:0)
我将添加Yola的解决方案,如果我想在一个数组中保留许多不同的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_Base
所有常用功能的新类Node<T>
继承,例如template <typename Ttype2> class Queue : public Queue_Base{
// Global Data Items
protected:
Node_Base* Front; //Front = new Node<Ttype2>();
Node_Base* Rear;
。 : -
.notification {
display: flex;
}
.push-title {
font-size: 1.15rem;
}
.push-active {
margin-left: 20%;
color: #8A8A8A;
}
.btn-active {
margin-left: 3%;
background: #FF512F;
background-image: -webkit-linear-gradient(left top, #FF512F, #DD2476);
background-image: -moz-linear-gradient(left top, #FF512F, #DD2476);
background-image: -ms-linear-gradient(bottom right, #FF512F, #DD2476);
background-image: -o-linear-gradient(bottom right, #FF512F, #DD2476);
background-image: linear-gradient(bottom right, #FF512F, #DD2476);
-webkit-border-radius: 60;
-moz-border-radius: 60;
border-radius: 60px;
padding: 0 10px;
text-decoration: none;
display: flex;
align-items: center;
width: 38px;
height: 22px;
justify-content: flex-start;
}
.btn-active span {
display: block;
padding: 5px;
background: green;
border-radius: 50%;
}
这取决于你的需求。