Здавалка
Главная | Обратная связь

Изменение закрытых данных-членов



Лучшие способы представления данных часто становятся очевидными на полпути в сумасшедшем рывке к завершению проекта. Как обсуждалось раньше, сохранение даты и временив виде числа секунд начиная с фиксированной даты (обычно, 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 Все права принадлежат авторам размещенных материалов.