1

クラス lista (リスト) から継承されたクラス polynom (polinom) を作成する必要があります。polynom クラスから 2 つのオブジェクトを加算、減算、乗算、除算する必要があります。私はこのコードを持っています。デストラクタが機能しない理由がわかりません。また、演算子をオーバーロードする必要があります: +、-、<<、>> しかし、方法がわかりません。

#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();


}
4

4 に答える 4

1

デストラクタはおそらくうまく機能していますが、それらを 2 回呼び出すと、2 回目の呼び出しでセグメンテーション違反が発生する可能性があります。次のように通話をドロップするだけです

l.~polinom()

あなたのコードから; デストラクタは自動的に呼び出されます。

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

于 2009-04-08T22:10:40.117 に答える
0

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

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

多項式メソッドは、算術演算を実行するために単項式のリストを反復処理します。

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

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

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

于 2009-04-08T23:10:24.793 に答える
0

これは宿題の質問ですか?

1 つには、lista のデストラクタは仮想ではありませんが、より大きな問題は、polynom のデストラクタが lista のデストラクタの単なるコピー アンド ペーストであることです。

ここで設計とコードを修正する必要があると思います...

于 2009-04-08T22:06:25.337 に答える