队列实现错误C ++

时间:2018-03-21 13:05:40

标签: c++ queue

尝试在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;,我在构造函数中获得了backfront的正确值;输出:

  

内部构造函数:back = 0 front = 0

但是当我要求队列的大小时,如下所示:q.size()(没有任何推/弹操作),我会得到非常奇怪的backfront值。一个示例输出:

  

尺寸:返回= 32766正面= -746749592

有谁可以请指出我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

当你这样做时

Queue(){
    Queue(SOME_PREDEFINED_CONSTANT);
}

您会在默认构造函数中创建一个临时对象,该对象会立即超出范围并被破坏。

有两种方法可以解决这个问题:

  1. 使用构造函数初始值设定项列表和委托构造函数的“新”方法:

    Queue() : Queue(SOME_PREDEFINED_CONSTANT)
    { /* empty */ }
    
  2. 使用默认参数的“旧”方式:

    template <class T> class Queue  {
        ...
    
    public:
        Queue(int size = SOME_PREDEFINED_CONSTANT){
            ...
        }
        ...
    };