0

我无法理解在多项式类中使用高级 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 的指针吗?

4

2 回答 2

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)

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

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

自然有很大的改进空间(即我们可以使二元运算成为友元函数,甚至更好的重载运算符)。

于 2012-11-21T00:14:28.020 回答
0

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

  1. 用户无需费力地进行低级操作即可使用它。
  2. 用户仅根据其接口(黑盒)使用该类。

在设计你的类时,你应该设身处地为一个不知道或想知道任何有关实现的用户着想。对于用户来说,类只是他们调用方法的东西,它可以完成工作。它是如何完成的是个谜。

让它成为你的指导原则。那么实现细节就是你用来实现它们的东西,因为它们不暴露给用户,所以它们与 ADT 没有任何关系。ADT 在界面中。

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

于 2012-11-21T00:07:20.203 回答