0

我有一个类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;
      }
   };

whereMonomial是使用结构的链表。在我的主要功能中,我有

    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)调用了第一个。所以我在insertandevaluate成员中设置了断点,我观察到所有的inserts 都在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);

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

4

3 回答 3

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-> 好的,但是如果您想将其用作链式,则必须返回一个参考,例如

  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;
  }
于 2013-04-23T09:04:11.017 回答
2

您需要将方法的返回值更改为insert引用:

Polynomial & insert(T c, int n);

当从此函数返回时,您现在所拥有的创建了对象的副本,随后的调用将值插入到副本中。

于 2013-04-23T09:04:48.917 回答
2

这是因为插入返回多项式。尝试返回参考:

Polynomial &insert(T c, int n){

通过返回多项式,插入总是返回对象本身的副本。所以第 30 行复制了许多原始 p,但 p 没有改变。

于 2013-04-23T09:04:49.713 回答