Программирование без упрятывания данных (в расчете на структуры) требует меньшего предварительного обдумывания задачи, чем программирование с упрятыванием данных (в расчете на классы). Структуру можно определить не очень задумываясь о том, как ее будут использовать. Когда определяется класс, внимание концентрируется на том, чтобы обеспечить для нового типа полный набор операций. Это важное смещение акцента в проектировании программ. Обычно время, затраченное на разработку нового типа, многократно окупается в процессе отладки и развития программы.
Вот пример законченного определения типа intset, представляющего понятие "множество целых":
class intset { int cursize, maxsize; int *x; public: intset(int m, int n); // не более m целых из 1..n ~intset();
int member(int t) const; // является ли t членом? void insert(int t); // добавить к множеству t
void start(int& i) const { i = 0; } void ok(int& i) const { return i<cursize; } void next(int& i) const { return x[i++]; } };
Для проверки этого класса вначале создадим, а затем распечатаем множество случайных целых чисел. Это простое множество целых можно использовать для проверки, есть ли повторения в их последовательности. Но для большинства задач нужен, конечно, более развитый тип множества. Как всегда возможны ошибки, поэтому нужна функция:
#include <iostream.h>
void error(const char *s) { cerr << "set: " << s << '\n'; exit(1); }
Класс intset используется в функции main(), для которой должно быть задано два параметра: первый определяет число создаваемых случайных чисел, а второй - диапазон их значений:
int main(int argc, char* argv[]) { if (argc != 3) error("нужно задавать два параметра"); int count = 0; int m = atoi(argv[1]); // число элементов множества int n = atoi(argv[2]); // из диапазона 1..n intset s(m,n);
while (count<m) { int t = randint(n); if (s.member(t)==0) { s.insert(t); count++; } }
print_in_order(&s); }
Значение счетчика параметров программы argc равно 3, хотя программа имеет только два параметра. Дело в том, что в argv[0] всегда передается дополнительный параметр, содержащий имя программы.
Функция