Queue implementation bug C++
本问题已经有最佳答案,请猛点这里访问。
当试图在C++中实现一个通用队列时,我面临着一个非常特殊的问题。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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); } }; |
当我初始化队列时,如:
inside constructor: back=0 front=0
但是,当我询问队列的大小时,如:
size: back=32766 front=-746749592
有人能指出我在这里做错了什么吗?
当你这样做的时候
1 2 3 | Queue(){ Queue(SOME_PREDEFINED_CONSTANT); } |
发生的情况是,在默认构造函数中创建一个临时对象,该对象立即超出范围并被销毁。
解决这个问题有两种方法:
使用构造函数初始值设定项列表和委托构造函数的"new"方法:
1 2 | Queue() : Queue(SOME_PREDEFINED_CONSTANT) { /* empty */ } |
使用默认参数的"旧"方法:
1 2 3 4 5 6 7 8 9 | template <class T> class Queue { ... public: Queue(int size = SOME_PREDEFINED_CONSTANT){ ... } ... }; |