多项式ADT类

时间:2012-11-20 23:53:50

标签: c++

我无法理解多项式类中高级ADT的使用。我得到的是

typedef struct term{
  double coef; 
  unsigned deg; 
  struct term * next;
}term_t;
typedef struct term * Term;
typedef struct term * Poly;

所以据说这是低级ADT,但我必须使用高级ADT,这意味着我必须上课。我开始做的是

class Polynomial{
private:
    typedef struct term{
        double coef;
        unsigned deg;
        struct term * next;
    }term_t;
    typedef struct term *Term;
    typedef struct term *Poly;
public:
    Polynomial(); //Constructor
    ~Polynomial(); //Destructor     
}

我的问题是低水平到ADT到高水平ADT的变化。该函数应该是私有的,然后通过公共函数访问吗?这基本上像多项式链表多项式类吗?我的开始好吗?因此,term和poly将指向coef和deg?

2 个答案:

答案 0 :(得分:1)

ADT是数据以及您可以对该数据执行的一组操作。 低级别或“C”ADT会将其视为一组函数,这些函数接收某种类型的句柄以及其他必需参数,并执行它们所代表的操作。

然而,在C ++中,事情变得更加简单,因为那些表示操作的函数可以通过类定义绑定到数据本身。

现在,在您的示例中,让我们考虑可以对多项式执行的操作类型;让我们尝试添加:

在C中你定义了一个这样的函数:

Poly poly_add (Poly p1, Polyp2)
{
/*addition code be here*/
}

我们如何在C ++中做到这一点?!好吧,我们希望方法绑定到对象,所以我们做这样的事情:

class Polynomial
{
  ....
public:
  Polynomial add(Polynomial& p2)
  {
    // addition code be here
  }
};

这将被称为p3 = p1.add(p2)

因此,为了回答您的问题,属于该类的全局方法可以直接在“低级”结构上运行,这就是您想要放置该代码的位置。

您还应该注意PolyTerm不是指针,而是类型。它们都是指向term_t结构的指针类型。

当然,存在很大的生存空间(即我们可以使二元运算成为朋友函数,甚至更好,重载运算符)。

答案 1 :(得分:0)

考虑抽象数据类型的方法是数据由它的作用(它的签名)而不是它的组成来定义。实际上,你的实现并不是因为你使用了一个类而自动处于高级别或低级别。如果出现以下情况,则为高级别或低级别:

  1. 用户无需使用低级操作即可使用它。
  2. 用户仅根据其界面(黑匣子)使用该课程。
  3. 在设计课程时,您应该让自己置身于不了解或不想了解实施的用户。对于用户来说,这个类只是他们调用方法的东西,它完成了工作。如何做到这一点很神秘。

    让这成为你的指导原则。然后,实现细节是您用来实现它们的东西,并且由于它们不向用户公开,因此它们与ADT没有任何关系。 ADT位于界面中。

    您可以应用的更具体的测试是尝试自己使用它并查看高级别。编写一个单独的程序来使用多项式,实例化类,使用它,然后问问自己它是否足够高。根据需要进行修改,直到获得正确的界面。