나는 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)
이 호출되었습니다. 그래서 나는 insert
과 evaluate
회원들에게 중단 점을 두었고, 이 호출되기 전에 모든 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;
}