【问题标题】:Linked lists,polynoms ,overloading operators << and >> in C++C++ 中的链表、多项式、重载运算符 << 和 >>
【发布时间】:2009-04-08 22:03:24
【问题描述】:

我必须构建一个从类 lista (list) 继承的类多项式 (polinom)。我必须从多项式类中加、减、乘、除 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();


}

【问题讨论】:

    标签: c++ linked-list


    【解决方案1】:

    您的析构函数可能运行良好,但您调用它们两次,第二次调用可能会导致段错误。只需挂断电话,例如

    l.~polinom()
    

    来自您的代码;析构函数被自动调用。

    第二件事是,你不需要在polinom 中复制lista 析构函数;基类的析构函数也会被自动调用。

    【讨论】:

      【解决方案2】:

      假设“polinom”表示“多项式”,那么您有一个基本的设计缺陷——多项式不是链表。您应该使用包含而不是继承来表示可以根据链表实现多项式。

      【讨论】:

      • 我必须使用链表而不是数组。我不知道如何使用收容措施。我必须使用继承。
      • 包含意味着使用链表作为lista类的成员,而不是从链表类继承
      【解决方案3】:

      这是一道作业题吗?

      首先,您在 lista 中的析构函数不是虚拟的,而是一个更大的问题 是你在 polynom 中的析构函数只是 lista 中析构函数的复制粘贴。

      我认为你真的需要在这里修改你的设计和代码......

      【讨论】:

        【解决方案4】:

        你应该有两个类:一个单项式类,它用一个系数和指数抽象出一个单项,一个多项式,它有一个单项式列表作为私有数据成员。

        单项式只允许您添加或减去指数相等的项;结果将是一个具有相同指数和系数之和或差的单项式。 mul 和 div 方法的结果也将是一个单项式,其系数的乘积或商作为其系数,指数的和或差作为其指数。

        多项式方法将遍历其单项式列表以执行算术运算。

        我同意不鼓励您扩展像链表这样的容器的评论。这最好表示为多项式 HAS-A 单项式列表,而不是 IS-A 单项式列表。这是一个微妙而重要的区别。

        HAS-A 的一个优点是它允许您更改用于存储单项式的数据结构,而不会影响客户端。数组、列表、地图——你的用户并不关心,只要你遵守合同。

        我不知道将单项式和多项式同等对待是否有优势,但如果有的话,您会想要一个定义通用方法和 GoF 复合模式的接口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-03
          • 2016-07-21
          • 2011-09-16
          相关资源
          最近更新 更多