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

1 ... 146 147 148 [ 149 ] 150 151 152 ... 342


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)



1 ... 146 147 148 [ 149 ] 150 151 152 ... 342

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