2009-04-08 3 views
1

클래스 list (list)로부터 상속받은 클래스 폴리곤 (polinom)을 만들어야합니다. 폴리곤 클래스에서 2 개의 객체를 더하거나, 빼거나, 곱하거나, 나눠야합니다. 나는이 코드를 가지고있다. 내 소멸자가 왜 작동하지 않는지 이해할 수 없습니다. 나는 또한 연산자에 과부하가 필요합니다 : +, -, < <, >>하지만 어떻게해야할지 모르겠다.연결된리스트, 다항식, 오버로딩 연산자 << and >> C++

#include <iostream> 
#include <conio.h> 

using namespace std; 

struct nod 
{float coef; 
int grad; 
nod* adr_urm; 
}; 

class lista 
{ 
public: 
    nod *vf,*sf; 
    lista(); 
    nod* adaug(nod *&vf,nod*& sf , int gr,float cf); 
    void afis(nod* vz); 
    ~lista(); 
}; 

class polinom : public lista 
{public: 
polinom(); 
~polinom(); 

}; 




void lista::afis(nod* vz) 
{nod *c=vz; 
cout<<"Elementele polinomului"<<endl; 
int i=0; 
while (c) 

{if (i) cout<<"+"; 
cout<<c->coef<<"X^"<<c->grad; 
c=c->adr_urm; 
i++; 
} 
cout<<endl<<endl; 
} 

nod* lista::adaug(nod *&vf,nod*& sf ,int gr,float cf) 
{ nod *c=new nod; 
c->coef=cf; 
c->grad=gr; 
c->adr_urm=0; 
if (vf==0) vf=sf=c; 
else {sf->adr_urm=c; 
     sf=c;} 
return vf; 
} 

lista::lista() 
{vf=0; 
} 

polinom::polinom() 
{vf=0; 
} 

lista::~lista() 
{nod *m=vf, *m1=vf->adr_urm; 
while (m1) 
     {delete m; 
     m=m1; 
     m1=m->adr_urm; 
     } 
vf=0; 
} 

polinom::~polinom() 
{nod *man=vf, *man1=vf->adr_urm; 
while (man1) 
     {delete man; 
     man=man1; 
     man1=man->adr_urm; 
     } 
vf=NULL; 
} 




int main() 
{ 
int m,nr,nr1; 
float n; 
nod* vf=0 ;nod *sf; 
nod* varFl=0 ;nod *varFv=0; 

polinom l,v; 

cout<<"Nr de elemente primul pol nr= "; 
cin>>nr; 
for (int i=1;i<=nr;i++) 
{ cout<<"Elementul "<<i<<endl; 
    cout<<"Coeficientul = "; 
    cin>>n; 
    cout<<"Gradul = "; 
    cin>>m; 
    l.adaug(vf,sf,m,n); 
    varFl=vf; 
} 
l.afis(varFl); 

vf=0; 

cout<<"Nr de elemente al doilea pol nr= "; 
cin>>nr1; 
for (int j=1;j<=nr1;j++) 
{cout<<"Elementul "<<j<<endl; 
cout<<"Coeficientul = "; 
cin>>n; 
cout<<"Gradul = "; 
cin>>m; 
v.adaug(vf,sf,m,n); 
varFv=vf; 
} 
v.afis(varFv); 

l.~polinom(); 
v.~polinom(); 
_getch(); 


} 

답변

0

숙제 문제입니까?

lista의 소멸자는 가상이 아니지만보다 큰 문제 은 polynom의 소멸자가 lista에있는 복사하여 붙여 넣기라는 것입니다. 난 당신이 정말 당신의 디자인과 여기에 코드를 수정할 필요가 있다고 생각

...

1

당신의 소멸자 아마 잘 작동하고 있습니다,하지만 당신은 그들을 두 번 호출하고 두 번째 통화는 아마 세그먼테이션 폴트 (segfault)를 발생시킨다.

l.~polinom() 

과 같은 전화를 코드에서 삭제하십시오. 소멸자는 자동으로 호출됩니다.

두 번째로, lista 소멸자를 polinom에 복사 할 필요가 없습니다. 기본 클래스의 소멸자도 자동으로 호출됩니다.

1

"polinom"은 "다항식"을 의미한다고 가정하면 기본적인 설계 결함이 있습니다. 다항식은 연결된 목록이 아닙니다. 다항식이 링크 된 목록의 관점에서 구현 될 수 있다는 것을 표현하기 위해 상속이 아닌 포함을 사용해야합니다.

+0

배열 대신 링크 된 목록을 사용해야합니다. 나는 용기를 사용하는 법을 모른다. 나는 상속을 사용해야합니다. –

+0

봉쇄는 연결된 목록 클래스에서 상속하는 것이 아니라 목록 클래스의 구성원으로 연결된 목록을 사용하는 것을 의미합니다. –

0

두 개의 클래스가 있어야합니다. 하나의 항을 계수와 지수로 추상화하는 단항 클래스와 단량체 목록을 개인 데이터 멤버로 갖는 다항식.

monomial은 지수가 같은 용어 만 더하거나 뺄 수 있습니다. 그 결과는 동일한 지수와 계수의 합 또는 차를 갖는 단량체가됩니다. mul 및 div 메서드의 결과는 지수의 지수 또는 지수의 합 또는 지수와 곱 또는 지수의 곱 또는 지수를 갖는 단량체가됩니다.

다항식 방법은 산술 연산을 수행하기 위해 단항 기호 목록을 반복합니다.

나는 링크 된 목록과 같은 컨테이너를 확장하지 못하도록하는 의견에 동의합니다. 이것은 IS-A 단항 물리스트가 아닌 다항식 HAS-A리스트로 가장 잘 표현됩니다. 그것은 미묘하고 중요한 차이입니다.

HAS-A의 한 가지 장점은 클라이언트에 영향을 미치지 않고 모노 매를 저장하는 데 사용하는 데이터 구조를 변경할 수 있다는 것입니다. 배열, 목록,지도 - 계약을 유지하는 한 사용자는 상관하지 않습니다.

monomials 및 다항식을 동일하게 취급 할 때 이점이 있는지는 모르지만 일반적인 방법과 GoF Composite 패턴을 정의하는 인터페이스가 필요한 경우에는 유용합니다.