尝试在C ++中实现通用队列时,我遇到了一个非常具体的问题。这是代码:
template <class T> class Queue {
private:
T * queue;
int front;
int back;
int MAX_SIZE;
public:
Queue(){
Queue(SOME_PREDEFINED_CONSTANT);
}
Queue(int size){
queue = new T[size];
MAX_SIZE = size;
front = 0;
back = 0;
cout << "inside constructor:" << " back= " << back << " front=" << front << endl;
}
void push(const T entry){
if(back < MAX_SIZE){
queue[back] = entry;
back++;
}
}
T peek(){
return queue[front];
}
void pop(){
if(size() > 0){
front++;
}
if(front==back){
front = 0;
back = 0;
}
}
int size(){
cout << "size:" << " back=" << back << " front=" << front << endl;
return (back-front);
}
};
当我初始化队列时,如下所示:Queue <int> q;
,我在构造函数中获得了back
和front
的正确值;输出:
内部构造函数:back = 0 front = 0
但是当我要求队列的大小时,如下所示:q.size()
(没有任何推/弹操作),我会得到非常奇怪的back
和front
值。一个示例输出:
尺寸:返回= 32766正面= -746749592
有谁可以请指出我在这里做错了什么?
答案 0 :(得分:4)
当你这样做时
Queue(){
Queue(SOME_PREDEFINED_CONSTANT);
}
您会在默认构造函数中创建一个临时对象,该对象会立即超出范围并被破坏。
有两种方法可以解决这个问题:
使用构造函数初始值设定项列表和委托构造函数的“新”方法:
Queue() : Queue(SOME_PREDEFINED_CONSTANT)
{ /* empty */ }
使用默认参数的“旧”方式:
template <class T> class Queue {
...
public:
Queue(int size = SOME_PREDEFINED_CONSTANT){
...
}
...
};