Программирование >>  Структурное программирование 

1 ... 140 141 142 [ 143 ] 144 145 146 ... 342


Печать времени в стандартном формате

void Time::printStandard() {

cout ({hour == 0 I I hour == 12 ) ? 12 : hour % 12) : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second (hour < 12 ? AM : PM );

Рис. 6.5. Исходный файл определений функций-элементов класса Time (часть 2 из 3)

FIG6 5.CPP Драйвер класса Timel

ЗАМЕЧАНИЕ: Компилируется вместе с TIME1.CPP iinclude <iostream.h> #include timel.h

Драйвер для проверки простого класса Time main () {

Time t; определение экземпляра объекта t класса Time

cout << Начальное значение военного времени равно ; t.printMilitary(); cout endl

Начальное значение стандартного времени равно ; t.printStandard();

t.setTime(13, 27, 6);

cout endl endl Военлое время после setTime равно ; t.printMilitary();

cout endl Стандартное время после setTime равно ; t.printStandard{);

t.setTime(99, 99, 99); попытка установить

неправильные значения

cout endl endl

<< После попытки неправильной установки: endl << Военное время: ; t.printMilitaryО;

cout << endl << Стандартное время: ; t.printStandard(); cout endl; return 0;

Начальное аначение военного времени равно 00:00:00 Начальное значение стандартного времени равно 12:00:00 ДМ

Военное время после setTime равно 13:27:06 Стандартное время после setTime равно 1:27:06 РМ

После попытки неправильной установки: Военное время: 00:00:00 Стандартное время: 12:00:00 AM

Рис. 6.5. Программа драйвера класса Time (часть 3 из 3)



Заметим, что объявление класса заключено в следующие директивы препроцессора (смотри главу 17):

Предотвращение многократного включения заголовочного файла #ifndef Т1МЕ1 Н fdefine Т1МЕ1 Н

#endif

При построении больших программ в заголовочные файлы будут помещаться также и другие определения и объявления. Приведенные выше директивы препроцессора предотвращают включение кода между #ifndef и #endif, если определено имя Т1МЕ1 Н. Если заголовок еще не включался в файл, то имя Т1МЕ1 Н определяется директивой #define и операторы заголовочного файла включаются в результирующий файл. Если же заголовок уже был включен ранее, Т1МЕ1 Н уже определен и операторы заголовочного файла повторно не включается. Попытки многократного включения заголовочного файла обычно случаются в больших программах с множеством заголовочных файлов, которые могут сами включать другие заголовочные файлы. Замечание: по негласному соглашению в приведенных выше директивах используется имя символической константы, представляющее собой просто имя заголовочного файла с символом подчеркивания вместо точки.

Хороший стиль программирования 6.2

Используйте директивы препроцессора #ifndef, #define и #endif для того, чтобы избежать включения в программу заголовочных файлов более одного раза.

Хороший стиль программирования 6.3

Используйте имя заголовочного файла с символом подчеркивания вместо точки в директивах препроцессора #ifndef и #define заголовочного файла.

6.8. Управление доступом к элементам

Спецификаторы доступа к элементу public и private (а также, как мы увидим в главе 9 Наследование , protected - защищенные) используются для управления доступом к данным-элементам класса и функциям-элементам. По умолчанию режим доступа для классов - private (закрытый), так что все элементы после заголовка класса и до первого спецификатора доступа являются закрытыми. После каждого спецификатора режим доступа, определенный им, действует до следующего спецификатора или до завершающей правой скобки (}) определения класса. Спецификаторы private, public и protected могут быть повторены, но такое употребление редко и может привести к беспорядку.

Закрытые элементы класса могут быть доступны только для функций-элементов (и дружественных функций) этого класса. Открытые элементы класса могут быть доступны для любых функций в программе.

Основная задача открытых элементов состоит в том, чтобы дать клиентам класса представление о возможностях (услугах), которые обеспечивает класс. Этот набор услуг составляет открытый интерфейс класса. Клиентов класса не должно касаться, каким образом класс выполняет их задачи. Закрытые



элементы класса и описания открытых функций-элементов недоступны для клиентов класса. Эти компоненты составляют реализацию (implementation) класса.

Замечание по технике программирования 6.10

C-I--I- способавует созданию программ, не зависящих от реализации. Если, изменяется реализация класса, используемого программой, не зависящей от реализации, то код этой программы не требует изменения, но может потребоваться его перекомпиляция.

Типичная ошибка программирования 6.4

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

Программа на рис. 6.6 демонстрирует, что закрытые элементы класса доступны только через открытый интерфейса класса, включающий открытые функции-элементы. Во время компиляции этой программы компилятор выдает две ошибки, объявляющие, что закрытые элементы, указанные в каждом операторе, недоступны. Программа на рис. 6.6 включает timel.h и компилируется вместе с файлом timel.cpp, описанном на рис. 6.5.

FIG6 6.CPP

Демонстрация ошибок вследствие попыток доступа к закрытым элементам класса #include <iostream.h> #include timel.h main() {

Time t;

Ошибка: Time : t.hour = 7;

hour недоступно

Ошибка: Time :: cout << минута =

minute недоступно t.minute;

return 0;

Compiling FIG6 6.CPP:

Error FIG6 6.CPP 12: Time :: hour is not accessible Error FI66 6.CPP 15: Time :: minute is not accessible

Рис. 6.6. Ошибочная попытка доступа к закрытым элементам класса

Хороший стиль программирования 6.4

Если вы намереваетесь сначала перечислить в определении класса закрытые эле менты, используйте явно метку private, несмотря на то, что private предполагается по умолчанию. Это облегчит чтение профаммы. Но мы предпочитаем первым в определении класса помещать список открытой части public.



1 ... 140 141 142 [ 143 ] 144 145 146 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика