2009-04-08 23 views
1

クラスlista(list)から継承したクラスポリノム(polinom)を構築する必要があります。私は、polynomクラスから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のデストラクタは仮想ではありませんが、より大きな問題 は、ポリゴーム内のデストラクタがlistaのコピー・ペーストだけであることです。

私はあなたが本当にここにあなたのデザインやコードを修正する必要があると思う...

1

あなたのデストラクタは、おそらくうまく機能しているが、あなたは二度それらを呼び出すと、2番目の呼び出しは、おそらくセグメンテーションフォールトが発生します。

l.~polinom() 

などのコードをコードから削除してください。デストラクタは自動的に呼び出されます。

もう1つは、listaデストラクタをpolinomにコピーする必要はありません。基本クラスのデストラクタも自動的に呼び出されます。

1

"polinom"は "多項式"を意味すると仮定すると、基本的な設計上の欠陥があります。多項式はリンクリストではありません。多項式をリンクリストの形で実装できることを表現するには、継承ではなく包含を使用する必要があります。

+0

配列の代わりにリンクリストを使用する必要があります。私は封じ込めを使う方法を知らない。私は継承を使用する必要があります。 –

+0

containmentは、リンクリストをリンククラスから継承するのではなく、リストクラスのメンバーとして使用することを意味します –

0

係数と指数で1つの項を抽象化する単項式クラスと、単項式データのメンバーとして単項式のリストを持つ多項式の2つのクラスがあります。

単項式は、指数が等しい項のみを加算または減算することができます。結果は同じ指数と係数の和または差を持つ単項式になります。また、mulとdivメソッドの結果は、係数の係数または商の指数としての指数の合計または異なる指数を持つ単項式になります。

多項式のメソッドは、その単項式のリストを繰り返し処理して算術演算を実行します。

リンクリストのようなコンテナを拡張することを嫌うコメントに同意します。これは単項式のIS-Aリストではなく、単項式の多項式HAS-Aリストとして最もよく表されます。それは微妙で重要な違いです。

HAS-Aの利点の1つは、クライアントに影響を与えずに単項式を保存するために使用するデータ構造を変更できることです。配列、リスト、マップ - あなたは契約を守っている限り、ユーザーは気にしません。

単項式と多項式を同じように扱うことに利点があるかどうかはわかりませんが、共通のメソッドとGoFコンポジットパターンを定義するインターフェイスが必要な場合は、

関連する問題