【发布时间】:2013-11-13 22:19:06
【问题描述】:
为了成为一名更有能力的 C++ 程序员,我正在尝试使用引用。过去,我通常在引用对象时使用指针,例如在 Objective-C 中。
所以我一直在编写一个 多项式 类来存储 Term 对象列表
(TermNode* termHead,termTail)
但是当我尝试使用列出的第一个实现将术语添加到列表时,在添加术语中调用术语上的构造函数时,会覆盖先前创建的术语节点中的 Term& 引用,就好像它使用了 this 上一次调用构造函数的指针。
列出的第一个实现在技术上存在什么问题,导致其行为异常?它只在我使用指针和 new 时起作用,即使我没有更改 TermNode 的结构。
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;
}
【问题讨论】:
-
使用引用作为结构/类成员是不常见的,而且非常棘手。你必须绝对确定被引用事物的生命周期长于结构对象的生命周期。
标签: c++ pointers reference constructor pass-by-reference