【问题标题】:Why the overloaded operator doesn't work?为什么重载的运算符不起作用?
【发布时间】:2017-01-18 10:24:31
【问题描述】:

我正在开发一个使用存储在 LinkedList 中的多项式的 C++ 项目。我想重载重要的运算符,例如 +、-、*、/。 当函数返回结果时,我遇到了析构函数的一些问题。

 Polynomial& Polynomial::operator+(const Polynomial &p){
    Polynomial  sum = *this;

    if (p.list.isEmpty())
        return *this;

    ListElement *temp = p.list.first;

    while (temp){
        sum.list.addSorted(temp->data);
        temp = temp->next;
    }

    return sum;
}

这个函数效果很好,但是return sum; 调用了析构函数,我丢失了数据。 Polynomial 类的析构函数调用list.purge(); 释放链表中的动态内存。所有的类和它的方法都很好。

我主要有:

Polynomial p1,p2,sum;
p1.input();              //here I input data for first pol
p2.input();

sum=p1+p2;               //I overloaded operator=, it works fine

我必须做什么来“停止”析构函数?我想在屏幕多项式sum 上输出。谢谢!

【问题讨论】:

  • 不要通过引用返回局部变量。
  • Polynomial& Polynomial::... -> Polynomial Polynomial::...
  • operator+ 破坏其操作的原始值也可能不是一个好主意。为避免这样做,请将此方法声明为const
  • Ursu,你熟悉三法则吗?如果没有,请阅读What is the Rule of Three?
  • 仅供参考,请参阅en.cppreference.com/w/cpp/language/operators中的“规范实现”

标签: c++ oop


【解决方案1】:

最好这样重载运算符+

Polynomial operator+(const Polynomial& p1, const Polynomial &p2){
    if (p1.list.isEmpty())
        return p2;
    else if (p2.list.isEmpty())
        return p1;

    Polynomial sum = p1;
    ListElement *temp = p2.list.first;
    while (temp){
        sum.list.addSorted(temp->data);
        temp = temp->next;
    }

    return sum;
}

1.让它有两个参数,把friend改成Polynomial

2.返回object而不是reference

【讨论】:

    【解决方案2】:

    您不应该返回对局部变量的引用!

    Polynomial  sum = *this;
    
    ...
    
    return sum;
    

    从返回类型中删除&sum 存在于堆栈中(也称为自动存储)。当它的包含范围退出时,它被销毁——该实例的析构函数被调用。你不应该返回对它的引用;这就像返回对幽灵的引用。

    如果按值返回,会返回一份sum,就OK了。

    【讨论】:

    • 是的,但是如果 OP 没有遵守三规则,他们仍然是一条小河。你不想知道桨在哪里。
    • 你说得对,他一定要学会遵守。
    • 你说得对,他一定要学会遵守。
    【解决方案3】:

    不要返回对局部变量的引用。在函数范围内创建的对象,在该范围内生存和死亡。

    但是,您可以创建引用对象的变量,并且该变量的生命周期现在与其引用的对象的生命周期相同。

    像这样:

    Polynomial& Polynomial::operator+(const Polynomial &p){
        Polynomial &sum = *this;
    
        if (p.list.isEmpty())
            return sum;
    
        ListElement *temp = p.list.first;
    
        while (temp){
            sum.list.addSorted(temp->data);
            temp = temp->next;
        }
    
        return sum;
    }
    

    【讨论】:

    • sum 现在不为 NULL,这很好,但我丢失了 p1 的数据。我的意思是: p1=5X^2 p2=X^2 在运算符函数之后 sum=6X^2 p1=6X^2 而不是5X^2 p2=X^2 这个怎么处理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多