Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

19.4.4. Створення власних маніпуляторних функцій

Програміст може самостійно створювати власні маніпуляторні функції. Існує два типи маніпуляторних функцій – ті, що приймають (параметризовані) і не приймають аргументи (непараметризовані). Для створення параметризованих маніпуляторів використовуються підходи, вивчення яких виходить за рамки цього навчального посібника. Проте створення непараметризованих маніпуляторів не викликає особливих труднощів.

Всі непараметризовані маніпуляторні функції виведення даних мають таку структуру:

ostream &manip_name(ostream &stream)

{

// код маніпуляторної функції

return stream; // Повертає посилання на параметр stream

}

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

У наведеному нижче коді програми створюється маніпулятор setup(), який встановлює прапорець вирівнювання по лівому краю, ширину поля в 10 символів і задає як заповнювальний символ знак долара.

Код програми 19.9. Демонстрація створення маніпулятора setup()

#include <iostream> // Для потокового введення-виведення

#include <iomanip>

using namespace std; // Використання стандартного простору імен

ostream &setup(ostream &stream)

{

stream.setf(ios::left); // Вирівнювання по лівому краю

/* Встановлює ширину поля в 10 символів і задає як заповнювальний

символ знак долара */

stream << setw(10) << setfill('$');

return stream; // Повертає посилання на параметр stream

}

int main()

{

cout << 10 << " " << setup << 10;

getch(); return 0;

}

Створення власних маніпуляторів є корисним з двох причин:

  • по-перше, іноді виникає потреба виконувати операції введення-виведення даних з використанням пристрою, до якого жоден з вбудованих маніпуляторів не застосовується (наприклад, плоттер). У цьому випадку створення власних маніпуляторів зробить виведення даних на цей пристрій зручнішим;

  • по-друге, може так статися, що у створеній Вами програмі деяка послідовність настанов повторюється декілька разів. І тоді ці операції можна об'єднати в один маніпулятор так, як це показано у попередній програмі.

Всі непараметризовані маніпуляторні функції введення даних мають таку структуру:

istream &manip_name(istream &stream)

{

// код маніпуляторної функції

return stream; // Повертає посилання на параметр stream

}

Наприклад, у наведеному нижче коді програми створюється маніпулятор prompt(). Він налаштовує вхідний потік на прийняття даних у шістнадцятковому представленні та виводить для користувача відповідне повідомлення.

Код програми 19.10. Демонстрація створення маніпулятора prompt()

#include <iostream> // Для потокового введення-виведення

#include <iomanip>

using namespace std; // Використання стандартного простору імен

istream &prompt(istream &stream)

{

cin >> hex;

cout << "Введіть число в шістнадцятковому форматі: ";

return stream; // Повертає посилання на параметр stream

}

int main()

{

int izm;

cin >> prompt >> izm;

cout << izm; // Виведення числа в шістнадцятковому форматі

getch(); return 0;

}

Необхідно пам'ятати! Надзвичайно важливо, щоб створений програмістом маніпулятор повертав потоковий об'єкт (елемент stream). Інакше цей маніпулятор не можна буде використовувати у складеному виразі введення або виведення.