我无法理解多项式类中高级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?
答案 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)
。
因此,为了回答您的问题,属于该类的全局方法可以直接在“低级”结构上运行,这就是您想要放置该代码的位置。
您还应该注意Poly
和Term
不是指针,而是类型。它们都是指向term_t
结构的指针类型。
当然,存在很大的生存空间(即我们可以使二元运算成为朋友函数,甚至更好,重载运算符)。
答案 1 :(得分:0)
考虑抽象数据类型的方法是数据由它的作用(它的签名)而不是它的组成来定义。实际上,你的实现并不是因为你使用了一个类而自动处于高级别或低级别。如果出现以下情况,则为高级别或低级别:
在设计课程时,您应该让自己置身于不了解或不想了解实施的用户。对于用户来说,这个类只是他们调用方法的东西,它完成了工作。如何做到这一点很神秘。
让这成为你的指导原则。然后,实现细节是您用来实现它们的东西,并且由于它们不向用户公开,因此它们与ADT没有任何关系。 ADT位于界面中。
您可以应用的更具体的测试是尝试自己使用它并查看高级别。编写一个单独的程序来使用多项式,实例化类,使用它,然后问问自己它是否足够高。根据需要进行修改,直到获得正确的界面。