|
Программирование >> Структурное программирование
FIG6 10.CPP Демонстрация функций записи и чтения класса Time #include <iostream.h> #include times.h void incrementMinutes(Time &, int); .-. i Ln () Time t; t.setHour(17); t.setMinute(34); t.setSecond(25); cout << Результат установки всех правильных значений: << endl Час: t.getHourО Минуты: t.getMinuteО Секунды: t.getSecond() << endl endl; t.setHour (234) ; t.setMinute(43); t.setSecond(6373); cout << Результат попытки установить неправильные часы и << секунды: endl Час: t.getHour() Минуты: t.getMinute () Секунды: <<t.getSecond() endl endl; t.setTime(11, 58, 0); incrementMinutes(t, 3) ; return 0; >id incrementMinutes(Time &tt, int count) cout << Увеличение минут на << count << endl << Начальное время: ; . tt.printStandardO ; for (int 1=1; i <= count; i++) { tt.setMinute((tt.getMinute0 + 1) % 60); if (tt.getMinute0 == 0) tt.setHour((tt.getHour0 + 1) % 24); cout << endl << минуты +1: ; tt.printStandard(); cout endl; Рис. 6.10. Использование функций записи и чтения (часть 3 из 4) Результат установки всех правильных значений: Час: 17 Минуты: 34 Секунды: 25 Результат попытки установить неправильные часы и секунды: Час: О Минуты: 43 Секунды: О Увеличение минут на 3 Начальное время: 11: 5в:00АМ минуты +1: 11: 59:00АМ минуты + 1: 12:00:00ЕМ минуты + 1: 12:01:00РМ Рис. 6.10. Использование функций записи и чтения (часть 4 из 4) Замечание по технике программирования 6.18 Доступ к закрытым данным посредством функций записи и чтения не только защи щает данные-элементы от присваивания им неправильных значений, но и отделяет клиентов класса от внутреннего представления данных-элементов. Таким образом, если внутреннее представление этих данных по каким-либо причинам (обычно из-за требований сокращения объема памяти или повышения производительности) изме няется, достаточно изменить только функции-элементы, а клиентам не требуется вносить никаких изменений, пока остается неизменным интерфейс функций-элемен тов. Однако, возможно, потребуется перекомпиляция клиентов данного класса. 6.15. Тонкий момент: возвращение ссылки на закрытые данные-элементы Ссылка на объект сама по себе является псевдонимом объекта и, следовательно, может быть использована с левой стороны оператора присваивания. Таким образом, ссылка является вполне допустимой L-величиной, которая может получать значение. Единственный (к сожалению!) способ использовать эту возможность - иметь открытую функцию-элемент класса, возвращающую неконстантную ссылку на закрытый элемент данных этого класса. Рисунок 6.11 использует упрощенную версию класса Time для демонстрации возвращения ссылки на закрытый элемент данных. Такое возвра-шение в действительности осуществляется вызовом псевдонима функции bad-SetHour для закрытого элемента данных hour. Этот вызов функции можно использовать во всех отношениях так же, как закрытый элемент данных, включая его как L-величину в оператор присваивания! Хороший стиль программирования 6.11 Никогда не возвращайте из открытой функции-элемента неконстантную ссылку (или указатель) на закрытый элемент данных. Возвращение такой ссылки нарушает инкапсуляцию класса. Программа начинается объявлением объекта t класса Time и ссылкой hour-Ref, которой присвоено значение, возвращенное вызовом t.badSetHour(20). Программа отображает на экране значение псевдонима hourRef. Далее этот псевдоним используется для установки значения hour равным 30 (неправильное значение) и это значение снова отображается на экране. В конце как L-величина используется вызов самой функции, ему присваивается значение 74 (другое неправильное значение), которое тоже отображается на экране. TIME4.H Объявление класса Time. Функции-элементы, определены в TIME4.CPP Предотвращение многократного включения заголовочного файла fifndef Т1МЕ4 Н Idefine Т1МЕ4 Н class Time { public: Time (int = 0, int = 0,int = 0); void setTime(int, int, int); int getHour(); int SbadSetHour(int); ОПАСНОЕ возвращение ссьшки private: int hour; int minute; int second; lendif Рис. 6.11. Возвращение ссылки на закрьпый элементу данных (чааь 1 из 3) TIME4.CPP Определения функций-элементов класса Time, tinclude time4.h tinclude <iostream.h> Функция конструктор для задания начальных значений закрытым данным вызывает функцию-элемент setTime, чтобы установить значения переменных по умолчанию равными нулю (смотри определение класса). Time::Time(int hr, int min, int sec) { setTime(hr, min, sec); } Установка значений часов, минут, секунд, void Time::setTime(int h, int m, int s) { hour = (h >= 0 && h < 24) ? h : 0; minute = (m >= 0 && m < 60) ? m : 0; second = (s>=0&&s<60) ?s : 0; Установка значения часа int Time::getHourО { return hour; ) ПЛОХАЯ ПРАКТИКА ПРОГРАММИРОВАНИЯ: Возвращение ссылки на закрытый элемент данных, int STime::badSetHour(int hh) { hour = (hh >= 0 && hh < 24) ? hh : 0; return hour; ОПАСНОЕ возвращение ссылки Рис. 6.11. Возвращение ссылки на закрытый элементу данных (чааь 2 из 3)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |