68938

Створення власних маніпуляторів

Лекция

Информатика, кибернетика и программирование

Систему введення-виводу можна удосконалити, створивши свої власні маніпулятори. Ця можливість є важливою по двох причинах. По-перше, можна зосередити декілька операцій введення-виводу в одному маніпуляторі. Наприклад, досить часто в програмах виконується одна і та ж послідовність операцій введення-виводу.

Украинкский

2014-09-27

41.5 KB

1 чел.

Лекція № 30

Тема: Створення власних маніпуляторів

План

  1.  Створення маніпуляторів
  2.  Маніпулятори виведення
  3.  Маніпулятори введення

Створення власних маніпуляторів

Систему введення-виводу можна удосконалити, створивши свої власні маніпулятори. Ця можливість є важливою по двох причинах. По-перше, можна зосередити декілька операцій введення-виводу в одному маніпуляторі. Наприклад, досить часто в програмах виконується одна і та ж послідовність операцій введення-виводу. В цьому випадку їх можна об'єднати. Це дозволяє спростити код і запобігти випадковим помилкам. По-друге, власний маніпулятор може знадобитися при роботі з нестандартними пристроями введення-виводу. Наприклад, маніпулятор можна застосовувати для передачі команд спеціальному принтеру або системі оптичного розпізнавання.

Власні маніпулятори повністю відповідають принципам об'єктно-орієнтованого програмування, але вони можуть виявитися корисними і для програм, створених в рамках процедурного програмування. Як ми згодом переконаємося, власні маніпулятори можуть допомогти ефективніше і просто виконати будь-яку програму, що інтенсивно виконує введення і виведення даних.

Як відомо, існують два типи маніпуляторів: для введення і для виводу. Крім того, маніпулятори розділяються на такі, що отримують аргументи і що не мають їх. Чесно кажучи, процедури, необхідні для створення маніпуляторів з параметрами, сильно залежать від конкретного компілятора і навіть від його версії. З цієї причини, перш ніж приступати до розробки маніпулятора з параметром, слід звернутися до документації, що описує компілятор. В той же час маніпулятори, що не мають параметрів, створюються досить просто, причому ця процедура для всіх компіляторів однакова.

Маніпулятори виведення

Скелет маніпулятора, що не має параметрів, виглядає так.

ostream &ім’я_маніпулятора (ostream &stream)

{

// Код

return stream;

}

Звернете увагу на те, що маніпулятор повертає посилання на потік типу ostream. Це дозволяє використовувати маніпулятор усередині складніших виразів. Слід мати на увазі, що хоча формально маніпулятор має один аргумент, що є посиланням на потік, при вставці маніпулятора в оператора виводу цей аргумент не указується.

Розглянемо програму, в якій описаний маніпулятор sethex(), що встановлює прапор showbase і виведення чисел, що породжує, в шістнадцятковому форматі.

#include <iostream>

#include <iomanip>

using namespace std;

// Простий маніпулятор виводу,

ostream &sethex(ostream &stream)

{

stream.setf(ios::showcase);

stream.setf(ios::hex, ios::basefield);

return stream;

}

int main()

{

cout « 256 « " " « sethex « 256;

return 0;

}

Ця програма виводить на екран наступні числа.

256 0x100

Очевидно, що маніпулятор sethex використовується як частина оператора виводу.

Власні маніпулятори не повинні бути дуже складними. Наприклад, прості маніпулятори la() і ra() виводять на екран стрілки, направлені вліво і управо.

#include <iostream>

#include <iomanip>

using namespace std;

// Стрілка, направлена управо

ostream &ra(ostream &stream)

{

stream << " > " ;

return stream;

}

// Стрілка, направлена вліво

ostream &la(ostream &stream)

{

stream « " < ";

return stream;

}

int main()

{

cout « "Залишок на рахунку " « ra « 1233.23 « "\n";

cout << "Заборгованість " « ra << 567.66 << la;

return 0;

}

Ця програма виводить на екран наступні рядки.

Залишок на рахунку > 1233.23

Заборгованість  > 567.66 <

Якби ці стрілки доводилося часто виводити уручну, ви швидко б втомилися.

Маніпулятори виводу особливо корисні при передачі команд спеціальним пристроям. Наприклад, принтер може отримувати велику кількість різноманітних команд, що змінюють розмір шрифту або його зображення, а також положення друкуючої головки. Якщо ці команди виконуються часто, їх краще доручити маніпулятору.

Маніпулятори введення

Всі маніпулятори введення, що не мають параметрів, виглядають таким чином.

istream &ім’я_маніпулятора (ostream Scstream)

{

// Код

return stream;

}

Маніпулятор введення отримує посилання на потік, для якого він викликається, а потім повертає її модулю, який його викликає.

У наступній програмі маніпулятор getpass() призначений для генерації сигналу і введення пароля.

#include <iostream>

#include <cstring>

using namespace std;

// Простій маніпулятор введення

istream &getpass(istream &stream)

{

cout « '\a'; // Звуковий сигнал

cout « "Введіть пароль: ";

return stream;

}

int main()

{

char pw[80];

do 

{

cin » getpass >> pw;

} while (strcmp(pw, "пароль"));

cout « "Вхід в систему виконаний \n";

return 0;

}

Зверніть увагу на те, що маніпулятор повинен повертати посилання на об'єкт класу istream, інакше його буде неможливо використовувати в ланцюжках операторів введення-виводу.


 

А также другие работы, которые могут Вас заинтересовать

79067. Развитие уголовного права в Риме в период империи 19.9 KB
  Характерной тенденцией развития уголовного права данного периода является то что ряд частных деликтов постепенно становятся уголовно наказуемыми включаются в категорию преступлений crimen publicum. Появляется также большое число новых преступлений в том числе таких которые рассматриваются как опасное посягательство на устои государства. В числе этих преступлений заговор с целью свержения императора покушение на его жизнь или жизнь его чиновников непризнание религиозного культа императора и т. К числу преступлений непосредственно...
79068. Развитие уголовного права в Риме в республиканский период. Виды преступлений. Виды наказаний. Уголовный суд и процесс 20.41 KB
  Благодаря этому обстоятельству приговор магистрата малопомалу теряет свое значение и собственными органами уголовного суда делаются comiti centurit если дело идет о cpite и tribut если дело идет об nquisitio pecuni. Все производство у магистрата приобретает характер предварительного следствия. Производство перед магистратом в уголовных делах по своему смыслу отнюдь не соответствует производству in jure в процессе гражданском: здесь магистрат ничего не разбирает и ничего не решает меж тем как в уголовном процессе суд магистрата имеет...
79069. Сервитуты. Понятие и виды. Хозяйственное значение и содержание сервитутов. Приобретение и утрата сервитутов. Защита сервитутного права 27.56 KB
  С ростом городов с увеличением скученности городских построек собственники городских земельных участков стали нуждаться в правовом средстве с помощью которого можно было бы предупредить полное затемнение одного участка постройкой на соседнем участке и т. Прочность удовлетворения потребности посредством такой правовой формы состояла в вещном характере сервитутного права: предметом сервитутного права являлся сам земельный участок а не действие определенного лица обязавшегося допускать пользование его земельным участком со стороны соседа....
79070. Содержание и виды договоров. Условия действительности договора. Недействительность договора (сделки). Договоры противозаконные и противоречащие добрым нравам. Пороки воли 24.85 KB
  Со временем договорами стали также считаться неформальные соглашения лиц. Такие соглашения именовались пактами и, в отличие от контрактов, первоначально не пользовались исковой защитой, так как заключались без соблюдения установленной процедуры.
79071. Стороны в обязательстве. Замена лиц в обязательстве. Обязательства с несколькими кредиторами или должниками 28.95 KB
  Обязательства с несколькими кредиторами или должниками. Оно рассматривалось как строго личная связь между кредитором и должником несмотря на имущественный характер содержания обязательства.С установлением обязательства связывались определенные юридические последствия исключительно для тех лиц которые его установили. Понимание обязательства как строго личного отношения между сторонами приводило также к тому что обязательство первоначально признавалось абсолютно непередаваемым ни на активной стороне переход права требования от кредитора к...
79072. Уголовное право Рима в древнейший период. Виды деликтов 19.71 KB
  Многие из таких частных деликтов известных Законам XII таблиц стали рассматриваться как преступления в последующем. преступления которые наказывались от имени римского народа а взыскания по ним шли не частным лицам а государству. К ним относились прежде всего преступления против республики. В зависимости от характера преступления смертная казнь принимала различные формы: отсечение головы утопление распятие сбрасывание с Тарпейской скалы и т.
79073. Формы гражданского процесса 28.39 KB
  Характерной особенностью римского гражданского процесса в течение республиканского периода и периода принципата было деление процесса на две стадии производства из которых первая называлась вторая judidum. Римская же первая стадия процесса приводила к окончанию дела только в случае признания иска ответчиком а такой вопрос как видно из открытых в 1933 году новых фрагментов Институций Гая прямо ставился истцом; требую чтобы ты сказал да или нет.Какими потребностями было вызвано деление римского процесса на две стадии и какие цели оно...
79074. Эмфитевзис и суперфиций. Сущность и причины образования этих институтов. Прекращение эмфитевзиса и суперфиция. Залог и его формы. Ипотека 27.26 KB
  Установление одного из этих двух прав на земельный участок дает право собственности на эту землю почти только номинальным; лишь после прекращения эмфитевзиса или суперфиция право собственности на данный участок получает реальное выражение. Как показывает термин emphyteusis от греческого emphyteuein насаждать этот институт перешел в римское право из Греции где наследственная аренда земли имела широкое применение эмфитевзис был издавна также в практике Египта и Карфагена.В содержание эмфитевзиса входит право пользоваться земельным...
79075. Безымянные контракты. Их характеристика. Типы безымянных контрактов. Виды пактов 32.41 KB
  сведены к четырем основным типам: 1 do ut des: я передаю тебе право собственности на вещь с тем чтобы ты передал мне право собственности на другую вещь; 2 do ut fcis: я передаю тебе право собственности на вещь с тем чтобы ты совершил известное действие оказал какието услуги и т.; 3 fcio ut des: я совершаю для тебя известное действие с тем чтобы ты передал мне право собственности на известную вещь; 4 fcio ut fcis: я совершаю для тебя известное действие с тем чтобы и ты совершил для меня какоето действие. При куплепродаже...