为什么重载的运算符不起作用?

时间:2017-01-18 00:45:20

标签: c++ oop

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

 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。谢谢!

3 个答案:

答案 0 :(得分:0)

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

Polynomial  sum = *this;

...

return sum;

从返回类型中删除&sum生活在堆栈上(也就是自动存储中)。当它的包含范围退出时,它将被销毁 - 调用该实例的析构函数。你不应该回复它的引用;它就像是返回鬼的引用。

如果按价值返回,将返还一笔金额副本,您将没事。

答案 1 :(得分:0)

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

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

像这样:

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

答案 2 :(得分:0)

以这种方式重载运算符+会更好:

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