2013-04-23 3 views
0

나는 Monomial이 구조체를 사용하여 링크 된 목록입니다 지난번 함수 호출 후 내 목록이 변경된 이유는 무엇입니까?

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

같은 클래스 Polynomial 정의합니다. 내 주요 함수에서 나는 라인 (30)과 (40)에서 브레이크 포인트를 가지고 디버깅하는 동안 라인 (40)에 내 출력이 정확하지만, 내가 p에있는 목록이 내가 예상 한 아니라는 것을 깨달았다

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 } 

이 , 그것은 처음에만 같았고 insert(1,2)이 호출되었습니다. 그래서 나는 insertevaluate 회원들에게 중단 점을 두었고, 이 호출되기 전에 모든 insert이 완료되었다는 것을 관찰했다. 그 후 나의 목록은 첫 삽입 후 상태로 돌아왔다. insert(1,2). 문제는이

 30  p.insert(1,2); p.insert(2,3); p.insert(2,1); p.insert(4,5); 
    40  cout<<p.evaluate(2); 

처럼 insert 전화를 분리 한 후 내가 원하는 것을 얻었 기 때문에 무슨 일이 있었 그러나이 두 가지 방법의 차이점은 무엇이며 왜 첫 번째가 제공되지 않는 이유를 정말 이해가 안

나는 내가 원했던 것을 (그것은 모두 삽입되었다). 당신이 체인으로 사용하려는 경우> 좋아하지만, 당신은 당신은 반환 값을 변경해야

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

답변

2

처럼 참조를 반환해야합니다 -

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을 반환하는 참고로 insert 방법 : 당신이 무엇

Polynomial & insert(T c, int n); 

이 함수에서 반환 할 때 객체의 사본을 만들고 후속 호출에서는 값을 사본에 삽입합니다.

2

삽입 기호가 다항식을 반환하기 때문입니다. 참조를 반환보십시오 :

Polynomial &insert(T c, int n){ 

를 다항식을 반환으로, 항상 객체 자체의 복사본을 반환 삽입합니다. 따라서 30 행은 원본 p의 복사본을 많이 만들지 만 p는 변경되지 않습니다.