【发布时间】:2017-01-02 14:24:57
【问题描述】:
我正在实现一个堆栈只是为了练习。所以,总的来说,我有这样的东西:
Stack stack;
stack.push(element1;
stack.push(element2);
Stack copy;
copy = stack;
所以我重载了赋值运算符,因为我还想生成新的元素实例(而不仅仅是将每个元素的指针从一个复制到另一个),如下
Stack &Stack::operator=(const Stack &toCopy) {
Stack* stack = new Stack;
if (toCopy.first == NULL) return *stack;
for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
stack->push(actual->elem);
}
// In this state, *stack has 2 elements as it should
return *stack;
}
回到主体,复制变量没有得到更改...它仍然是空的,就好像分配从未发生过一样。好像我刚刚做了Stack copy;你能解释一下这里发生了什么吗?
【问题讨论】:
-
为什么投反对票?
-
听起来你对内存管理有一些基本的误解。您的
operator=泄漏内存(new Stack永远不是deleted)。它也永远不会更新*this,而是更新新堆栈并且永远不会对新堆栈做任何事情。您的代码的其他部分可能有很多您没有发布的错误。以后发MCVE,如果你停止使用原始指针,生活会变得更轻松。 -
你应该修改
operator=中的this,而不是返回一个新的堆栈。 -
您的 operator= 应该更改
this并返回对this的引用,而不是创建新对象并返回它。 -
我现在明白了。谢谢大家!
标签: c++ pointers reference operator-overloading assignment-operator