より有能な C++ プログラマーになるために、参照を使用して実験しています。これまで、Objective-C の場合のように、オブジェクトを参照するときは通常、ポインターを使用していました。
だから私はTermオブジェクトのリストを格納するPolynomialクラスをプログラミングしてきました
(TermNode* termHead,termTail)
しかし、リストされている最初の実装を使用して用語をリストに追加しようとすると、用語の追加で Term のコンストラクターを呼び出すと、以前に作成された Term ノードの Term& 参照が上書きされます。コンストラクタ。
リストされた最初の実装について、異常な動作を引き起こす技術的な問題は何ですか? TermNode の構造を変更しなくても、ポインタとnewを使用すると機能します。
struct TermNode {
Term& value;
TermNode* next;
};
Term::Term(int coefficient,int firstTermDegrees,int secondTermDegrees) {
this->coefficient = coefficient;
this->xDegree = firstTermDegrees;
this->yDegree = secondTermDegrees;
}
//Doesn't work
void Polynomial::addTerm(int coefficient, int xDegree, int yDegree) {
Term term(coefficient,xDegree,yDegree);
addTerm(term);
}
void Polynomial::addTerm(Term& term) {
TermNode* t = new TermNode{term,nullptr};
if(isEmpty())
{
termHead = t;
termTail = t;
}
else
{
termTail->next = t;
termTail = termTail->next;
}
}
//Does work
void Polynomial::addTerm(int coefficient, int xDegree, int yDegree) {
Term* term = new Term(coefficient,xDegree,yDegree);
addTerm(term);
}
void Polynomial::addTerm(Term* term) {
TermNode* t = new TermNode{*term,nullptr};
if(isEmpty())
{
termHead = t;
termTail = t;
}
else
{
termTail->next = t;
termTail = termTail->next;
}
}
bool isEmpty() {
return nullptr == termHead;
}