You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项式类赋值(=)运算符重载异常问题求助

解决多项式类赋值运算符重载的异常问题

看起来你遇到的问题很典型——自赋值和乘法赋值时出现系数翻倍,大概率是赋值运算符的实现细节没处理好,或者乘法运算不小心修改了原对象。我来帮你拆解可能的原因和解决办法:

1. 自赋值的处理缺失

当执行P = P时,如果你的赋值运算符没有先判断自赋值,很容易出问题。比如如果你的逻辑是没有清空原对象,直接把rhs的项追加到当前对象后面,那P=P时,原P的项还在,你又把P的项加了一遍,自然系数翻倍。

正确的赋值运算符应该先处理自赋值,再清空当前对象,最后深拷贝:

Polynomial& operator=(const Polynomial& rhs) {
    // 第一步:拦截自赋值,直接返回
    if (this == &rhs) {
        return *this;
    }

    // 第二步:清空当前对象的所有项
    Term* temp;
    while (next != nullptr) {
        temp = next;
        next = next->next;
        delete temp;
    }
    next = nullptr; // 别忘了置空头指针

    // 第三步:深拷贝rhs的每一项
    Term* current = rhs.next;
    Term* last = nullptr;
    while (current != nullptr) {
        Term* newTerm = new Term();
        newTerm->coefficient = current->coefficient;
        newTerm->exponent = current->exponent;
        newTerm->next = nullptr;

        if (next == nullptr) {
            next = newTerm;
        } else {
            last->next = newTerm;
        }
        last = newTerm;
        current = current->next;
    }

    return *this;
}

2. 乘法运算符(operator*)修改了原对象

如果你的operator*不是const成员函数,或者在实现时不小心修改了this或者other的系数,那执行P = Q*P时,Q*P会先修改原P的内容,然后赋值回去,导致系数异常。

正确的乘法运算符应该返回一个新的Polynomial对象,并且是const成员函数,保证不修改原对象:

Polynomial operator*(const Polynomial& other) const {
    Polynomial result;

    Term* pCurrent = this->next;
    while (pCurrent != nullptr) {
        Term* qCurrent = other.next;
        while (qCurrent != nullptr) {
            int newCoeff = pCurrent->coefficient * qCurrent->coefficient;
            int newExp = pCurrent->exponent + qCurrent->exponent;
            // 这里要调用合并同类项的方法,而不是直接加新节点
            result.mergeTerm(newCoeff, newExp);
            qCurrent = qCurrent->next;
        }
        pCurrent = pCurrent->next;
    }

    return result;
}

注意这里的mergeTerm方法要检查结果中是否已有相同指数的项,如果有就累加系数,没有才新建节点——如果你的addTerm只是直接加节点,那同类项会重复,但你这里是翻倍,所以更可能是前面的自赋值或赋值时没清空的问题。

3. 辅助函数的潜在问题

比如你的addTerm或者mergeTerm方法是否有逻辑错误?比如在添加项时不小心把原对象的节点共享了(浅拷贝),导致修改时同时影响多个对象?不过这种情况更多是野指针或者重复释放,而不是系数翻倍,但也可以排查一下。

快速排查步骤

  1. 先给赋值运算符加上自赋值判断,并且确保拷贝前清空了当前对象的所有项;
  2. 检查operator*是否是const成员,是否在内部修改了this或other;
  3. 测试P = P是否正常,如果正常再测试P = Q*P。

内容的提问来源于stack exchange,提问作者Stavros Avramidis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:24