我将课程Polynomial
定义为
template<typename, T>
class Polynomial{
Monomial<T> *head;
public:
Polynomial(Monomial<T> *p=NULL){ head=p;}
Polynomial insert(T c, int n){
Monomial<T>*q=new Monomial<T>(c,n);
Monomial<T> *p=head, *t=NULL;
while(p!=NULL && q->pw < p->pw) { t=p; p=p->next;}
if(t==NULL){q->next=head; head=q; }
else{ t->next = q; q->next=p; }
return *this;
}
T evaluate(T x){
T sum=0;
for(Monomial<T>* p=head; p!=NULL; p=p->next)
sum+=p->evaluate(x);
return sum;
}
};
其中Monomial
是使用struct的链表。在我的主要功能中我有
10 int main(){
20 Polynomial<int> p;
30 cout<<p.insert(1,2).insert(2,3).insert(2,1).insert(4,5).evaluate(2);
40 p.destroy();
50 }
我在第30和第40行以及第40行都有断点,但在调试时我意识到尽管我的输出是正确的,但我在p
中的列表并不是我预期的那个,它就像只有第一个insert(1,2)
被召唤。所以我在insert
和evaluate
成员中加入了断点,我发现所有insert
都是在evaluate
被调用之前完成的,之后我的列表又回到了状态第一次插入insert(1,2)
。
我真的不明白为什么会这样,因为在分离insert
这样的调用之后
30 p.insert(1,2); p.insert(2,3); p.insert(2,1); p.insert(4,5);
40 cout<<p.evaluate(2);
我得到了我想要的东西,但是这两种方法有什么区别,为什么第一种方法没有给我我想要的东西(即所有插入都存在)。
答案 0 :(得分:4)
在
Polynomial insert(T c, int n){ // <- returns the value which cannot be chained
Monomial<T>*q=new Monomial<T>(c,n);
Monomial<T> *p=head, *t=NULL;
while(p!=NULL && q->pw < p->pw) { t=p; p=p->next;}
if(t==NULL){q->next=head; head=q; }
else{ t->next = q; q->next=p; }
return *this;
}
您正在返回*this
- &gt;好吧,但是如果你想把它当作链式使用,你必须返回一个像
Polynomial& insert(T c, int n){ // <- see the Polynomial&, returns reference, which can be chained
Monomial<T>*q=new Monomial<T>(c,n);
Monomial<T> *p=head, *t=NULL;
while(p!=NULL && q->pw < p->pw) { t=p; p=p->next;}
if(t==NULL){q->next=head; head=q; }
else{ t->next = q; q->next=p; }
return *this;
}
答案 1 :(得分:2)
您需要将insert
方法的返回值更改为引用:
Polynomial & insert(T c, int n);
现在,您从此函数返回时创建了对象的副本,后续调用将值插入副本。
答案 2 :(得分:2)
这是因为插入返回多项式。尝试返回参考:
Polynomial &insert(T c, int n){
使用返回的多项式,insert总是返回对象本身的副本。因此第30行创建原始p的许多副本,但p不变。