あなたは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;