Изменение закрытых данных-членов
Лучшие способы представления данных часто становятся очевидными на полпути в сумасшедшем рывке к завершению проекта. Как обсуждалось раньше, сохранение даты и временив виде числа секунд начиная с фиксированной даты (обычно, 1 января 1970 года в DOS) более удобно и позволяет использовать другие библиотечные функции, использующие такой же формат хранения даты и времени. Функция-член ChangeTime() в листинге 2.4 преобразует данные-члены дату и время в длинное целое (timeinsecs), что расходует время и производительность в случае частых вызовов этой функции. Очевидно, это функция упростится, если дата и время уже будет храниться в виде длинного целого. В листингах 2.6 и 2.7 внесены эти изменения в предоставлении данных в классе TTime.файл TIME2.H и соответствующий ему модуль TIME2.EXE.CPP _не законченные программы. Их необходимо скомпилировать и скомпоновать вместе с еще одним модулем, подобным APPOINT2.CPP, в котором определена функция main(). Чтобы скомпилировать результативную программу для DOS, введите команду bcc appoint2 time2.Запустите получившийся в результате выполняемый файл APPOINT2.EXE, введя его имя. Вы также можете скомпилировать каждый модуль отдельно и скомпоновать их объектные файлы с помощью нескольким команд: bcc -c appoint2 bcc -c time2 bcc appoint2.obj time2.obj Таким образом, существует более чем один способ “спустить шкуру с кошки” и скомпилировать программу на С++. Для того чтобы скомпилировать и запустить APPOINT2 из интегрированной среды, откройте файл проекта APPOINT2.IDE и нажмите <Ctrl+F9>, как это вы уже делали с APPOINT1. не забудьте использовать Project|Build all в случае появления ошибок (конечно, вызванных предыдущей компиляцией модуля TIME2 для DOS, что делает объектный код несовместимым с Windows). Листинг 2.6 TIME2.H ( измененный класс TTime) 1: // time2.h – объявление класса TTime 2: 3: #ifndef __TTIME2_H 4: #ifndef __TTIME2_H 1 //Предотвращение нескольких #include 5: 6: class Ttime { 7: private: 8: long dt; // Дата и время – в секундах от 1 января 1970 года 9: public: 10: void Display(void); 11: void GetTime(int &m, int &d, int &y, int &hr, int &min); 12: void SetTime(int m, int d, int y, int hr, int min); 13: char *GetSTime(void); 14: void ChangeTime(long nminutes); 15: }; 16: 17: #endif // _ TIME2_H Класс TTime в TIME2.H идентичен TTime в TIME1.H за исключением того. Что в объявлении присутствует лишь одно закрытое длинное целое dt. Удалены индивидуальные компоненты month, day, year, hour и minute. Конечно, несмотря, на проведенные изменения, открытые функции-члены - те же самые, и нет нужды в изменении операторов, в которых используется класс TTime. Собственно функции-члены нуждаются в изменении, но, по крайней мере, это работа ограничена известным числом легко идентифицируемых функций. В листинге 2.7 решается эта задача. Листинг 2.7. TIME2.CPP (реализация измененного класса TTime) 1: // time2.cpp – реализация класса TTime 2: 3: #include <iostream.h> 4: #include <time.h> 5: #include <dos.h> 6: #include <string.h> 7: #include ”time2.h” 8: 9: // Отображение даты и времени 10: void Ttime::Display(void) 11: { 12: cout << ctime( &dt); 13: } 14: 15: // Возвращает текущие данные-члены (дату и время) 16: void TTime::GetTime(int &m, int &d, int &y, int &hr, int &min); 17: { 18: struct data ds; 19: struct time ts; 20: 21: unixtodos(dt, &ds, &ts); 22: y = ds.da_year; 23: m = ds.da_mon; 24: d = ds.da_day; 25: hr = ts.ti_hour; 26: min = ts.ti_min; 27: } 28: 29: // Устанавливать член dt 30: void TTime::SetTime(int m, int d, int y, int hr, int min); 31: { 32: struct data ds; 33: struct time ts; 34: 35: ds.da_year = y; 36: ds.da_mon = m; 37: ds.da_day = d: 38: ts.ti_hour = hr; 39: ts.ti_min = min; 40: ts.ti_sec = 0; 41: ts.ti_hund = 0; 42: dt = dostounix(&ds, &ts); 43: } 44: 45: // Возвращает дату и время в виде строки 46: char *TTime::GetSTime(void) 47: { 48: char *cp = strdup(ctime(&dt)); 49: return cp; 50: } 51: 52: //Добавление nminutes (может быть отрицательным) к текущему времени 53: void TTime::ChangeTime(long minutes) 54: { 55: dt += (nminutes * 60); 56: } Новый модуль существенно улучшен по сравнению со старым и занимает меньше памяти. Теперь, когда дата и время сохраняется в виде длинного целого, в строке12 просто вызывается библиотечная функция ctime() для преобразования даты и времени в строку ASCII. Функции – члены GetTime () и PutTime() стали немного сложнее, чем до этого, поскольку им теперь необходимо преобразовать дату и время в разделении параметры и обратно с помощью библиотечных функций unixtodos() и dostounix(), упоминавшихся ранее. Функции-члены GetSTime() и ChangeTime() существенно улучшены (строки 45–56). GetSTime() передает результат функции ctime() непосредственно strdup() для возвращения даты и время в виде строки. Но лучше всего преобразовалась ChangeTime(), выродившись простой оператор. Поскольку дата и время теперь хранятся в нужной форме, нет больше необходимости в операторах преобразования из предыдущей версии. Изменение формата данных для упрощения кода – сберегающий время стиль оптимизации программ. С помощью ООП и классов С++ изменения фундаментальной структуры данных не обязательно потребуют соответствующих изменении операторов, использующих эту информацию. Как показано в листинге 13.8, основная программа в проекте “не помнит” об основных модификациях, сделанных классы TTime. Новая главная программа, APPOINT2.СPP, идентична APPOINT1.CPP, за исключением строки 3, включающей заголовочный файл TIME2.H вместоTIME1.H. В этом маленьком примере действительные преимущества ООП практически незаметны. Конечно, в программе из 10,000 строк с сотнями объектов TTIME изменении потребуется не больше, чем в этом примере! Инкапсуляция данных и функций в классе локализуют изменения в коде путем запрещения прямого доступа к данным, минимизируя таким образом потенциальное количество модификаций, требующихся после изменения внутреннего предоставления данных. Листинг 2.8. APPOINT2.CPP (отображение примера календаря встреч) 1: #include <iostream.h> 2: #include <stdio.h> 3: #include “time2.h” 4: 5: mаin() 6: { 7: TTime appointment; 8: 9: appointment.SetTime(7, 21, 1996, 8, 30); 10: for (int slots = 1; slots <= 17; slots++) { 11: appointment.Display(); 12: appointment.ChangeTime(30); 13: } 14: return 0; 15: } Open project Add item Типы доступа Член класса может иметь следующие модификаторы доступа: · public - общедоступный член класса; · protected - доступный только для членов и объектов данного класса и наследуемых классов (наследуемых с модификаторами доступа public или protected); · private - защищенный метод, доступный только внутри класса.
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|