Программирование >>  Дополнительные возможности наследования 

1 ... 225 226 227 [ 228 ] 229 230 231 ... 265


Листинг 21.8. ПсноАьзование Оитовых uoicD

3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

#include <iostream.h> #include <string,h>

enum STATUS { FullTime, PartTime } ; enum GRADLEVEL { UnderGrad, Grad } ; enum HOUSING { Dorm, OffCampus } ;

enum FOODPLAN { OneMeal, AllMeals, WeekEnds, NoMeals }

class student {

public: StudentO

myStatus(FullTime),

myGradLevel(UnderGrad),

myHousing(Dorm),

myFoodPlan(NoMeals)

student(){ }

STATUS GetStatusO;

void SetStatus(STATUS);

unsigned GetPlanO { return myFoodPlan; )

private:

unsigned myStatus : 1; unsigned myGradlevel: 1; unsigned myHousing : 1; unsigned myFoodPlan : 2;

STATUS student: : GetStatusO {

if (myStatus)

return FullTime: else

return PartTime;

void student:;SetStatus(STATUS theStatus) {

myStatus = theStatus;

int mainO {

student Jim;

if (Jim.GetStatus()== PartTime)

cout << Jim is part time << endl;



49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

else

cout << Jim is full time endl;

Jim.SetStatus(PartTime);

if (Jim.GetStatusO)

cout << Jim is part time << endl; else

cout Jim is full time endl;

cout Jim is on the ;

char Plan[80];

switch (Jim.GetPlanO)

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

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

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

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

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

cout Plan << food plan, endl; return 0;

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

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

STATUS student;:GetStatus() {

return myStatus; }



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

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

cout Jim is Jim,GetStatusO endl;

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

Jim Is О

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

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

case О

case 1

case 2

case 3

strcpy(Plan, One meal ); break; strcpy(Plan, All meals ); break; strcpy(Plan, Weekend meals ); break; strcpy(Plan, No Meals ):break;

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

Стиль программирования

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

Следующие рекомендации совершенно ни к чему вас не обязывают. Они основаны на ряд принципов, которых я придерживаюсь при работе над проектами и которые нахожу полезными. Вы можете выработать собственные правила, но приведенные ниже помогут вьщелить основные моменты, на которые следует обратить внимание.

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

Отступы

Отступ табуляции должен составлять четыре пробела. Убедитесь в том, что ваш редактор преобразует каждую табуляцию в четыре пробела.



1 ... 225 226 227 [ 228 ] 229 230 231 ... 265

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