2017-01-18 72 views
1

我正在处理存储在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 

我必须做的 “停止” 析构函数?我想在屏幕上输出Polynomial sum。谢谢!

+8

不要通过引用返回局部变量。 – AlexD

+3

'Polynomial&Polynomial :: ...' - >'Polynomial Polynomial :: ...' – jaggedSpire

+3

对于'operator +'来说,它可能不是一个好主意,它会破坏其操作的原始值。为了避免这样做,将此方法声明为'const'。 – tadman

回答

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

让它有两个参数,并使其friendPolynomial

2.退货object而不是reference

0

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

Polynomial sum = *this; 

... 

return sum; 

从返回类型中删除&sum住在堆栈上(又名自动存储)。当其包含范围退出时,它将被销毁 - 该实例的析构函数被调用。你不应该返回一个引用;这就像返回一个参考鬼。

如果您按价值返回,则会返回一笔金额的副本,您将无误。

+1

中的“规范实现”是的,但如果OP没有遵守三规则,他们仍然是一条小溪。你不想知道桨的位置。 – user4581301

+0

你是对的,他应该学习它并遵守它。 –

+0

你是对的,他应该学习它并遵守它。 –

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

'sum'现在不是NULL,它很棒,但是我失去了p1的数据。我的意思是: _p1 = 5X^2 p2 = X^2_ 运算符函数之后 _sum = 6X^2_ ** p1 = 6X^2 **而不是5X^2 p2 = X^2 如何处理这个? –