Студопедия

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

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

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






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Листинг 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.