为了成为一名更有能力的 C++ 程序员,我正在尝试使用引用。过去,我通常在引用对象时使用指针,例如在 Objective-C 中。
所以我一直在编写一个存储Term对象列表的多项式类
(TermNode* termHead,termTail)
但是,当我尝试使用列出的第一个实现将术语添加到列表中时,在 add term 中调用 Term 上的构造函数时,会覆盖先前创建的 Term 节点中的 Term& 引用,就好像它使用了上一次调用中的this指针构造函数。
列出的第一个实现在技术上存在什么问题,导致其行为异常?即使我没有更改 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;
}