当我在复制构造函数中使用原始堆栈的push()
和pop()
函数时,它会给出以下错误:
[错误]将'const Stack'作为'void'的'this'参数传递 Stack :: pop()[with type = int]'丢弃限定符 [-fpermissive]
如何使用push和pop将一个堆栈复制到另一个堆栈?
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
{
}
}
答案 0 :(得分:0)
const Stack<type> & originalStk
是堆栈的const&
。
这意味着您承诺不通过此引用修改它。
pop
修改堆栈。不要将pop
上的const&
拨打到堆栈。
您的代码可以修改为支持template <class type> Stack<type>::Stack(Stack<type>&& originalStk)
。
但是,如果不使用pop
和push
以及topVal
进行变更,则无法复制堆栈。您必须使用更丰富的接口将复制构造函数(使用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>
。