полиномиальный класс ADT

У меня проблемы с пониманием использования 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

Решение

ADT — это данные вместе с набором операций, которые вы можете выполнять над этими данными.
ADT низкого уровня или «C» будет видеть его реализованным как набор функций, которые получают справиться своего рода к данным, наряду с другими необходимыми параметрами, и выполнять операции, которые они представляют.

В 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

Другие решения

Способ представления об абстрактных типах данных заключается в том, что данные определяются тем, что они делают (своей подписью), а не тем, из чего они состоят. В действительности, ваша реализация не является автоматически высоким или низким уровнем только потому, что вы использовали класс; это высокий уровень или низкий уровень, если:

  1. Пользователю не нужно возиться с операциями низкого уровня, чтобы использовать его.
  2. Пользователь использует класс исключительно с точки зрения его интерфейса (черный ящик).

При разработке вашего класса вы должны поставить себя на место пользователя, который не знает или не хочет ничего знать о реализации. Для пользователя класс — это нечто, для чего они вызывают методы, и он выполняет свою работу. Как это делается — загадка.

Пусть это будет вашим руководящим принципом. Детали реализации — это то, что вы используете для их реализации, и, поскольку они не доступны пользователю, они не имеют никакого отношения к ADT. ADT находится в интерфейсе.

Более конкретный тест, который вы можете применить, состоит в том, чтобы попытаться использовать его самостоятельно и посмотреть, насколько высок уровень. Напишите отдельную программу для использования полиномов, создайте экземпляр класса, используйте его, а затем спросите себя, достаточно ли он высокого уровня. Пересматривайте по мере необходимости, пока не получите правильный интерфейс.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector