1

次のように表されるリンクリストがあります

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つの多項式がある場合、1つは別の多項式のコピーであり、次にもう1つの項を加算します。次に、加算演算子を使用しようとすると、2番目の多項式が加算されるように、最初の多項式が大きくなります。

4

2 に答える 2

2

あなたはoperator+()です。「期間」所有権の概念を検討してください。各多項式には、用語のリンクリストがあります。それはこのリストを所有しています(少なくともそれはより良いです)。次に、この簡単な分析について考えてみましょう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)、コピーを1つずつp2用語リストの末尾にリンクします。注:テールは、新しい用語がリンクされるたびに移動します。
  • valでp2を返します。あなたのコピー-ctorsとデストラクタが彼らの仕事をしているなら、すべてがうまくいくはずです。完了したら、* thisと、そのままにしてrhsおく必要があります。

それは私が提供できる範囲についてです。幸運を。

PS:追加クレジットボーナスラウンドの場合は、リスト内の用語を挿入するときに並べ替えます。これにより、同程度のマージに一歩近づくことができます。これは、のバックボーンとoperator +=()なり、を大幅に支援しますoperator +()。後者は文字通り退化してPolynomial p2 = *this; p2 += poly; return p2;

于 2012-11-27T06:59:57.550 に答える
2

参照によって一時を返していますが、これは未定義の動作です。代わりにを返しPolynomialます。つまり

Polynomial & operator+ (const Polynomial & ) const;

する必要があります

Polynomial operator+ (const Polynomial & ) const;

コピーコンストラクターとコピー代入演算子もありません。

于 2012-11-27T06:23:17.450 に答える