【问题标题】:Queue implementation bug C++ [duplicate]队列实现错误 C++ [重复]
【发布时间】:2018-08-30 14:52:05
【问题描述】:

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

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

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

尺寸:背面=32766 正面=-746749592

谁能指出我在这里做错了什么?

【问题讨论】:

  • 这个:Queue(){ Queue(SOME_PREDEFINED_CONSTANT); 没有做你认为它正在做的事情。
  • Queue() : Queue(SOME_PREDEFINED_CONSTANT) {} 如所写,您的默认构造函数不会初始化任何成员。在它的主体中,它创建并立即丢弃一个临时的Queue,它的效果为零。
  • 阅读rule of 0/3/5
  • 除了@Igor:Queue(int size = SOME_PREDEFINED_CONSTANT)实现了和“二合一”一样的效果。如果Queue 是不带参数构造的,则默认使用SOME_PREDEFINED_CONSTANT

标签: c++ queue


【解决方案1】:

当你这样做时

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

【讨论】:

  • 委托构造函数是 C++14 吗?
  • @user463035818 C++11
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
相关资源
最近更新 更多