|
Программирование >> Структурное программирование
ссылаться на counter, переменная counterPtr объявлена, чтобы указывать на counter. Важно отметить, что здесь элемент данных х сделан открытым просто для того, чтобы продемонстрировать способы доступа к открытым элементам. Как мы уже установили, данные обычно делаются закрытыми (private), чему мы и будем следовать в дальнейшем. FIG6 4.CPP Демонстрация операций доступа к элементам класса . и -> ПРЕДУПРЕЖДЕНИЕ: В ПОСЛЕДУЮЩИХ ПРИМЕРАХ МЫ БУДЕМ ИЗБЕГАЕМ ОТКРЫТЫХ ДАННЫХ! #include <iostream.h> Простой класс Count class Count { public: int X ; void print 0 { cout endl; } main ( ) { Count counter, *counterPtr = scounter ScounterRef = counter; создается объект counter указатель на counter ссьшка на counter cout << Присваивание x значения 7 и печать по имени объекта: ; counter.X =7; присваивание 7 элементу данных х counter.print О; вызов функции-элемента для печати cout Присваивание х значения 8 и печать по ссылке: ; counterRef.x =8; присваивание 8 элементу данных х counterRef.print(); вызов функции-элемента для печати cout Присваивание х значения 10 и печать по указателю: ; counterPtr->x = 10; counterPtr->print(); return 0; } присваивание 10 элементу данных х вызов функции-элемента для печати Присваивание х Значения 7 и печать по имени об-ьекта: 7 Присваивание х значения 8 и печать по ссылке: 8 Присваивание х значения 10 и печать по указателю: 10 Рис. 6.4. Доауп к данным-элементам объекта и функциям-элементам посредством имени объекта, ссылки и указателя на объект 6.7. Отделение интерфейса от реализации Один из наиболее фундаментальных принципов разработки хорошего программного обеспечения состоит в отделении интерфейса от реализации. Это облегчает модификацию программ. Что касается клиентов класса, то изменения в реализации класса не влияют на клиента до тех пор, пока интерфейс класса, изначально предназначенный для клиента, остается неизменным (функции класса можно расширять за пределы исходного интерфейса). Замечание по технике программирования 6.8 Клиенты класса не нуждаются в доступе к исходному коду класса для того, чтобы использовать класс. Однако, клиенты должны иметь возможность связаться с объектным кодом класса. Это стимулирует независимых продавцов программного обеспечения поставлять библиотеки классов для продажи или лицензирования. Продавцы поставляют в своих продукт£1х только заголовочные файлы и объектные модули. Не выдается никакой оригинальной, патентоспособной информации, как это было бы в случае поставки исходных кодов. Сообщество пользователей С-Н- извлекает выгоду, имея в своем распоряжении большинство библиотек классов, поставляемых независимыми продавцами. На самом деле все выглядит не в таком розовом свете. Заголовочные файлы содержат некоторзпо часть реализации и краткие сведения о других частях реализации. Встраиваемые функции-элементы, например, должны находиться в заголовочном файле, так что когда компилятор компилирует клиента, клиент может включить определение встраиваемой функции inline. Закрытые элементы перечисляются в определении класса в заголовочном файле, так что эти элементы видимы для клиентов, несмотря на то, что клиенты не могут иметь к ним доступа. Замечание по технике программирования 6.9 Информация, важная для интерфейса класса, должна включаться в заголовочный файл. Информация, которая будет использоваться только внутри класса и которая не является необходимой для клиентов класса, должна включаться в неоглашаемый исходный файл. Это еще один пример принципа наименьших привилегий. Рисунок 6.5 разбивает программу на рис. 6.3 на ряд файлов. При построении программы на С-Н- каждое определение класса обычно помещается в заголовочный файл, а определения функций-элементов этого класса помещаются в файлы исходных кодов с теми же базовыми именами. Заголовочные файлы включаются (посредством #include) в каждый файл, в котором используется класс, а файлы с исходными кодами компилируются и компонуются с файлом, содержащим главную программу. Посмотрите документацию на ваш компилятор, чтобы определить, как компилировать и компоновать программы, содержащие множество исходных файлов. Программа на рис. 6.5 состоит из заголовочного файла timel.h, в котором объявляется класс Time, файла timel.cpp, в котором описываются функции-элементы класса Time, и файла fig6 5.cpp, в котором описывается функция main. Выходные данные этой программы идентичны выходным данным программы на рис. 6.3. Замечание по технике программирования 6.7 Помещайте объявление класса в заголовочный файл, чтобы оно было доступно любому клиенту, который захочет использовать класс. Это формирует открытый интерфейс класса. Помещайте определения функций-элементов класса в исходный файл. Это формирует реализацию класса. class Time { public: Time О; конструктор void setTime(int, int, int); установка часов, минут, секунд void printMilitaryО; печать времени в военном формате void printStandardО; печать времени в стандартном формате private: int hour; 0-23 int minute; 0-59 int second; 0-59 #endif Рис. 6.5. Заголовочный файл класса Time (часть 1 из 3) TIME1.CPP Определения функций-элементов для класса Time. iinclude <iostream.h> tinclude tirael.h Конструктор Time присваивает нулевые начальные значения каждому элементу данных. Обеспечивает согласованное начальное состояние всех объектов Time Time::Time О { hour = minute = second =0; } Задание нового значения Time в виде военного времени. Проверка правильности значений данных. Обнуление неверных значений. void Time::setTime(int h, int m, int s) { hour = (h >= 0 &S h < 24) ? h : 0; minute = (m >= 0 && m < 60) ? m : 0; second =(s>=0s&s<60) ?s:0; Печать времени в военном формате void Time::printMilitary() cout (hour < 10 ? 0 : ) hour : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second; TIME1.H Объявление класса Time. Функции-элементы определены в TIME.CPP Предотвращение многократного включения заголовочного файла #ifndef Т1МЕ1 Н #define Т1МЕ1 Н Определение абстрактного типа данных Time
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |