我正在为练习而实现一个堆栈。所以,基本上,我有这样的东西:

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;
}

回到主要位置,copy变量没有得到更改...它仍然是空的,好像分配从未发生过。好像我刚刚做了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;
}

关于c++ - 赋值运算符不应该返回 “empty”实例吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39157390/

10-12 04:19
查看更多