|
Программирование >> Дополнительные возможности наследования
Листинг 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; Самое важное в использовании битовых полей то, что клиент класса не должен беспокоиться насчет способа хранения данных. Поскольку битовые поля относятся к скрытым данным, вы можете свободно изменить их впоследствии, при этом никаких изменений интерфейса не потребуется. Стиль программирования Как уже упоминалось в этой книге, в профамме важно придерживаться одного принятого стиля, хотя в целом не имеет значения, какому именно стилю вы отдаете предпочтение. Соблюдение определенного стиля существенно облегчает чтение и анализ профаммы. Следующие рекомендации совершенно ни к чему вас не обязывают. Они основаны на ряд принципов, которых я придерживаюсь при работе над проектами и которые нахожу полезными. Вы можете выработать собственные правила, но приведенные ниже помогут вьщелить основные моменты, на которые следует обратить внимание. Хотя в жизни чрезмерная пунктуальность нас раздражает, тем не менее строгое соблюдение стиля при написании профаммы поможет вам и вашим коллегам эффективнее использовать и модернизировать однажды написанный код. Постарайтесь выработать собственный стиль профаммирования и затем относитесь к нему так, как к уголовному кодексу, нарушение которого карается законом. Отступы Отступ табуляции должен составлять четыре пробела. Убедитесь в том, что ваш редактор преобразует каждую табуляцию в четыре пробела.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |