重载加法运算符

时间:2012-11-27 06:18:28

标签: c++

我有一个表示为

的链表
struct term{
    double coef;
    unsigned deg;
    struct term * next;
    };

然后我有一个多项式类

class Polynomial{
public:
    Polynomial & operator+ (const Polynomial & ) const;
private:
    term *ptr

我试图做一个额外的重载运算符,但是我试着给我一些中间的多项式的随机部分。

Polynomial & Polynomial::operator+(const Polynomial & poly) const{
    Polynomial p2 = *this;
    term * temp = (*this).ptr;
    while(temp->next != NULL){
        temp = temp->next;
    }
    temp->next = poly.ptr;
    return p2;
}

并且当我有2个多项式时,一个是另一个的副本然后再添加一个项,然后当我尝试使用加法运算符时,第一个多项式更大,就像第二个多项式被添加到它。

2 个答案:

答案 0 :(得分:2)

您通过引用返回temp,这是未定义的行为。请改为Polynomial。即。

Polynomial & operator+ (const Polynomial & ) const;

应该是

Polynomial operator+ (const Polynomial & ) const;

你也错过了copy constructor and copy assignment operator

答案 1 :(得分:2)

你是操作员+()严重受到打击。考虑“期限”所有权的概念。每个多项式都有一个链接的术语列表。它拥有这个列表(至少它更好)。现在考虑对operator +()

简要分析
Polynomial Polynomial::operator+(const Polynomial & poly) const 
{
    // hopefully creates a deep copy of *this
    Polynomial p2 = *this;

    // walk *our* terms (not the copy in p2??) to find the end.
    term * temp = (*this).ptr;
    while(temp->next != NULL)
        temp = temp->next;

    // once we find the end, we then *LINK* the params term-list
    //  which *they* are **supposed** to own, to our list. (and 
    //  p2 is still out there with a copy of our original content).
    temp->next = poly.ptr;

    // now we return p2, still holding a copy of our former self,
    // and we now have a cross-linked term list between us and the 
    // parameter poly
    return p2;
}

我真诚地希望这显然有什么问题。为了使其正常工作,您的操作员应该返回一个by-val(它很好!),然后正确地制造这个东西:

  • 制作* this(你有那个)
  • 的副本(让我们称之为p2
  • 查找p2
  • 所拥有的术语列表的结尾
  • 复制rhs operator +(const Polynomial* rhs)参数中的所有字词,将这些副本逐个链接到p2条款列表的尾部。注意:尾部将随着每个新术语的链接而移动。
  • 按val返回p2。如果你的副本和破坏者正在做他们的工作,一切都应该好了。完成后,* this和rhs都应该不受影响。

这就是我能提供的程度。祝你好运。

PS:对于额外信用额外奖励,请在插入时在列表中对您的字词进行排序。这将使您更接近同一学位合并,这将成为operator +=()的支柱,并极大地帮助您operator +()。后者字面上退化为Polynomial p2 = *this; p2 += poly; return p2;