模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用

pop() and push() in copy constructor of template stack class not working

本文关键字:不起作用 push pop 构造函数 堆栈 复制      更新时间:2023-10-16

当我在复制构造函数中使用原始堆栈的push()pop()函数时,它给了我以下错误:

[错误] 将"const Stack"传递为"void"的"this"参数 堆栈::p op(( [与类型 = int]' 丢弃限定符 [-允许]

如何使用推送和弹出将一个堆栈复制到另一个堆栈?

template <class type> Stack<type>::Stack(const Stack<type> & originalStk)
{
    MAXSIZE=originalStk.getSize();
    list = new type[MAXSIZE];
    top = -1;
    if(!originalStk.isEmpty())
    {
        Stack<type> temp(originalStk.getSize());
        while(!originalStk.isEmpty())
        {
            temp.push(originalStk.topVal());
            originalStk.pop();
        }
        while(!temp.isEmpty())
        {
            originalStk.push(temp.topVal());
            push(temp.topVal());
            temp.pop();
        }   
    }
    else
    {
    }
}

const Stack<type> & originalStk是堆栈的const&

这意味着您承诺不会通过此引用对其进行修改。

pop修改堆栈。 不要在堆栈const&上调用pop

可以修改您的代码以支持template <class type> Stack<type>::Stack(Stack<type>&& originalStk) .

但是,如果不使用 poppushtopVal 来改变堆栈是不可能的。 您必须使用更丰富的堆栈接口编写复制构造函数(取const&(。

由于您在类型中,这很容易。

MAXSIZE=originalStk.getSize();
list = new type[MAXSIZE];
top = -1;
std::copy(originalStk.list, origialStk.list+MAXSIZE, (type*)list);
top = originalStk.top;

现在,使用new和手动指针生存期管理是代码异味。 将 list 替换为 unique_ptr<type[]> ,或将所有 3 个状态变量替换为 std::vector<type>