gpt4 book ai didi

c++ - 为什么我的列表在上次函数调用后发生了变化?

转载 作者:太空宇宙 更新时间:2023-11-04 15:05:32 24 4
gpt4 key购买 nike

我有一个类 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 是一个使用结构的链表。在我的主要功能中,我有

    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) 一样。所以我在 insertevaluate 成员中放置了断点,我观察到所有 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);

我得到了我想要的东西,但这两种方法有什么区别,为什么第一种方法没有给我想要的东西(即所有插入都存在)。

最佳答案

 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 -> 好吧,但是如果你想将它作为链式使用,你必须返回一个像这样的引用

  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;
}

关于c++ - 为什么我的列表在上次函数调用后发生了变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16165221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com