Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 21.8. Использование битовых полей






1: #include < iostream.h>

2: #include < string.h>

3:

4: enum STATUS { FullTime, PartTime };

5: enum GRADLEVEL { UnderGrad, Grad };

6: enum HOUSING { Dorm, OffCampus };

7: enum FOODPLAN { OneMeal, AllMeals, WeekEnds, NoMeals };

8:

9: class student

10: {

11: public:

12: student():

13: myStatus(FullTime),

14: myGradLevel(UnderGrad),

15: myHousing(Dorm),

16: myFoodPlan(NoMeals)

17: { }

18: ~student() { }

19: STATUS GetStatus();

20: void SetStatus(STATUS);

21: unsigned GetPlan() { return myFoodPlan; }

22:

23: private:

24: unsigned myStatus: 1;

25: unsigned myGradLevel: 1;

26: unsigned myHousing: 1;

27: unsigned myFoodPlan: 2;

28: };

29:

30: STATUS student:: GetStatus()

31: {

32: if (myStatus)

33: return FullTime;

34: else

35: return PartTime;

36: }

37: void student:: SetStatus(STATUS theStatus)

38: {

39: myStatus = theStatus;

40: }

41:

42:

43: int main()

44: {

45: student Jim;

46:

47: if (Jim.GetStatus()== PartTime)

48: cout < < " Jim is part time" < < endl;

49: else

50: cout < < " Jim is full time" < < endl;

51:

52: Jim.SetStatus(PartTime);

53:

54: if (Jim.GetStatus())

55: cout < < " Jim is part time" < < endl;

56: else

57: cout < < " Jim is full time" < < endl;

58:

59: cout < < " Jim is on the ";

60:

61: char Plan[80];

62: switch (Jim.GetPlan())

63: {

64: case OneMeal: strcpy(Plan, " One meal"); break;

65: case AllMeals: strcpy(Plan, " All meals"); break;

66: case WeekEnds: strcpy(Plan, " Weekend meals"); break;

67: case NoMeals: strcpy(Plan, " No Meals"); break;

68: default: cout < < " Something bad went wrong! \n"; break;

69: }

70: cout < < Plan < < " food plan. " < < endl;

71: return 0;

72: }

 

Результат:

Jim is part time

Jim is full time

Jim is on the No Meals food plan.

 

Анализ: Строки 4—7 содержат определение нескольких перечислений. Они используются для определения значения битовых полей внутри класса student.

В строках 9—28 объявляется класс student. Несмотря на тривиальность, он интересен тем, что все его данные упакованы в пяти битах. Первый бит определяет, является ли данный студент представителем очной (full time) или заочной (part time) формы обучения. Второй — получил ли этот студент степень бакалавра (UnderGrad). Третий — проживает ли студент в общежитии. И последние два бита определяют, какой из четырех возможных вариантов питания в студенческой столовой выбран студентом.

Методы класса не отличаются ничем особенным от методов любого другого класса, т.е. на них никоим образом не повлиял тот факт, что они написаны для битовых полей, а не для обычных целочисленных значений или перечислений.

Функция-член GetStatus() считывает значение бита и возвращает константу перечисления, но это не обязательное решение. С таким же успехом можно было бы написать вариант, непосредственно возвращающий значение битового поля. Компилятор сам сможет преобразовать битовое значение в константу.

Чтобы убедиться в этом, замените выполнение функции GetStatus() следующим кодом:

STATUS student:: GetStatus()

{

return myStatus;

}

При этом в работе программы не произойдет никаких изменений. Вариант, приведенный в листинге, — это дань ясности при чтении кода, а на результат работы компилятора это изменение никак не повлияет.

Обратите внимание на то, что строка 47 должна проверить статус студента (full time или part time), а затем вывести соответствующее сообщение. Попробуем выполнить то же самое по-другому:

cout < < " Jim is " < < Jim.GetStatus() < < endl;

В результате выполнения этого выражения будет выведено следующее сообщение:

Jim is 0

Компилятор не сможет перевести константу перечисления PartTime в соответствующую строку текста.

В строке 62 программы определяется вариант питания студента и для каждого возможного значения соответствующее сообщение помещается в буфер, а затем выводится в строке 70. Опять-таки заметим, что конструкцию с оператором switch можно было бы написать следующим образом:

case 0: strcpy(Plan, " One meal"); break;

case 1: strcpy(Plan, " All meals"); break;

case 2: strcpy(Plan, " Weekend meals"); break;

case 3: strcpy(Plan, " NoMeals"); break;

Самое важное в использовании битовых полей то, что клиент класса не должен беспокоиться насчет способа хранения данных. Поскольку битовые поля относятся к скрытым данным, вы можете свободно изменить их впоследствии, при этом никаких изменений интерфейса не потребуется.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.