队列实现错误C ++

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);
        }
};

当我初始化队列时,如:Queue q;,我在构造函数中得到了backfront的正确值;输出:

inside constructor: back=0 front=0

但是,当我询问队列的大小时,如:q.size()(没有任何push/pop操作),我得到了backfront的非常奇怪的值。一个样本输出:

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){
            ...
        }
        ...
    };