赋值运算符不应该返回 "empty" 实例?
Assignment operator is returning an "empty" instance when it shouldn't?
我正在实现一个堆栈只是为了练习。所以,总的来说,我有这样的东西:
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;
}
回到 main 中,复制变量没有得到更改...它仍然是空的,就好像赋值从未发生过一样。好像我刚刚做了 Stack copy;
你能解释一下这里发生了什么吗?
您没有修改当前对象(即 *this
)。
您只是通过 new
创建了一个新对象,然后将其返回。注意copy = stack;
,它等同于copy.operator=(stack);
,注意返回值没有被使用,只是被丢弃(并导致内存泄漏),copy
没有改变。
你应该这样做:
Stack &Stack::operator=(const Stack &toCopy) {
// do some work to clear current elements in *this
// ...
// add elements from toCopy
for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
this->push(actual->elem);
}
// operator= is supposed to return *this in general
return *this;
}
您可能误解了赋值运算符。它在等号左边的对象的上下文中起作用。因此,您的 ::operator=(...)
应该始终在 *this
上工作,并且也应该始终 return *this
。
您发布的 operator=(...)
正在对您在堆上分配的 new 堆栈对象进行操作,并且您正在对 进行操作它 而不是 *this
.
您可以有效地将代码中的 stack
替换为 this
。即:
Stack &Stack::operator=(const Stack &toCopy) {
//Stack* stack = new Stack; // Don't do this.
if (toCopy.first == NULL) return *this;
for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
this->push(actual->elem); // You could also just call push without "this->"
}
// In this state, *stack has 2 elements as it should
return *this;
}
我正在实现一个堆栈只是为了练习。所以,总的来说,我有这样的东西:
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;
}
回到 main 中,复制变量没有得到更改...它仍然是空的,就好像赋值从未发生过一样。好像我刚刚做了 Stack copy;
你能解释一下这里发生了什么吗?
您没有修改当前对象(即 *this
)。
您只是通过 new
创建了一个新对象,然后将其返回。注意copy = stack;
,它等同于copy.operator=(stack);
,注意返回值没有被使用,只是被丢弃(并导致内存泄漏),copy
没有改变。
你应该这样做:
Stack &Stack::operator=(const Stack &toCopy) {
// do some work to clear current elements in *this
// ...
// add elements from toCopy
for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
this->push(actual->elem);
}
// operator= is supposed to return *this in general
return *this;
}
您可能误解了赋值运算符。它在等号左边的对象的上下文中起作用。因此,您的 ::operator=(...)
应该始终在 *this
上工作,并且也应该始终 return *this
。
您发布的 operator=(...)
正在对您在堆上分配的 new 堆栈对象进行操作,并且您正在对 进行操作它 而不是 *this
.
您可以有效地将代码中的 stack
替换为 this
。即:
Stack &Stack::operator=(const Stack &toCopy) {
//Stack* stack = new Stack; // Don't do this.
if (toCopy.first == NULL) return *this;
for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
this->push(actual->elem); // You could also just call push without "this->"
}
// In this state, *stack has 2 elements as it should
return *this;
}