У меня проблемы с пониманием использования 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?
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
структура.
Естественно, есть много возможностей для улучшения (то есть мы можем сделать бинарные операции дружественными функциями и, что еще лучше, перегруженными операторами).
Способ представления об абстрактных типах данных заключается в том, что данные определяются тем, что они делают (своей подписью), а не тем, из чего они состоят. В действительности, ваша реализация не является автоматически высоким или низким уровнем только потому, что вы использовали класс; это высокий уровень или низкий уровень, если:
При разработке вашего класса вы должны поставить себя на место пользователя, который не знает или не хочет ничего знать о реализации. Для пользователя класс — это нечто, для чего они вызывают методы, и он выполняет свою работу. Как это делается — загадка.
Пусть это будет вашим руководящим принципом. Детали реализации — это то, что вы используете для их реализации, и, поскольку они не доступны пользователю, они не имеют никакого отношения к ADT. ADT находится в интерфейсе.
Более конкретный тест, который вы можете применить, состоит в том, чтобы попытаться использовать его самостоятельно и посмотреть, насколько высок уровень. Напишите отдельную программу для использования полиномов, создайте экземпляр класса, используйте его, а затем спросите себя, достаточно ли он высокого уровня. Пересматривайте по мере необходимости, пока не получите правильный интерфейс.