Программирование >>  Программирование на языке c++ 

1 ... 105 106 107 [ 108 ] 109 110 111 ... 159


Рассмотрим пример использования манипуляторов с аргументами:

#include <iostream.h> #include <iomanip.h> void main(void)

cout setw(5) setfillC-) setbase{16) 10 endl;

Результат: -a

cout << setiosflags(ios::uppercase ios::internal ios::showbase) << setfill(-) setbase(16) setw(5) 10 endl;

Результат: 0X~A

cout 10 endl;

Результат: OXA

cout resetiosflags(ios::showbase) 10 endl; Результат: A

cout setiosflags{ios::fixed) setprecision(l)

12.12345 endl; Результат: 12.1

Область действия каждого манипулятора начинается с момента его появления до момента его отмены. Таким образом, в следующей строке:

cout hex а b с;

действие манипулятора hex будет распространяться на все три переменные а,Ь и с.

Покажем теперь, как можно определить новые манипуляторы. Мы можем объявить класс с функцией operator (), которая в свою очередь вызывает определенные функции форматирования, например:

class my f { };

ostream& operator<<{ostream& s,my f) { s.width(5);

s.flags{ios::internal);

return s; }



Опишем объект класса my f: my f MF;

Теперь можно задавать соответствующее форматирование непосредственно при выводе данных:

cout MF -47;

Тогда результат будет представлен в следующем виде:

- 47

Ниже приводится полный исходный текст программы, определяющей новый манипулятор:

#include <iostream.h> class my f { };

ostream& operator<<(ostream& s,my f) { s.width(5);

s.flags(ios::internal);

return s; }

void main(void) { my f MF;

cout -47 endl MF -47 endl;

Результат: -47

- 47

Можно также определить новые манипуляторы с параметрами. Пусть, например, необходимо задать новый манипулятор wp(n,m), который устанавливает ширину поля п и точность m для чисел с плавающей запятой:

#include <iostream.h> class my manip { int n,m;

ostream& (*f)(ostream&,int,int); public:

my manip(ostream& (*F){ostream&,int,int),int N,int M) :

f(F), n(N), m(M) { } friend ostream& operator (ostream& s,my manip& my) { return my.f(s,my.n,my.m); }



ostream& wi pre(ostream& s,int n,int m) { s.width(n);

s.flags{ios::fixed);

s.precision(m);

return s; }

my manip wp{int n.int m) { return my manip(wi pre,n,m); } void main(void)

{ cout 12.8764 endl wp{10,2) 12.8764

endl; Результат: 12.8764 12.88

Рассмотрим этот пример подробнее. Конструктор класса my manip описан в виде

my manip(ostream& (*F)(ostream&,int,int),int N.int М) : f{F), n(N). m(M) { }

Он сохраняет значения его аргументов (F, N и М) в локальных компонентах f, п и m (здесь f - это указатель на функцию). Первый аргумент конструктора представлен в виде

ostream& (*F)(ostream&,int,int)

Здесь F - указатель на функцию, имеющую три аргумента (типа ostream&, типа int и типа int) и возвращающую ссылку на класс ostream. Теперь конкретную функцию можно задавать для класса my manip через указатель при конструировании объекта этого класса.

Одна из функций, которую можно задавать при конструировании объекта класса my manip, описана следующим образом:

ostream& wi pre(ostream& s,int n,int m) { s.width(n);

s.flags(ios::fixed);

s.precision(m);

return s; }

Она устанавливает щирину поля n, точность m и задает вывод вещественных чисел в виде < целая часть . дробная часть >, т. е., например 10.237.



1 ... 105 106 107 [ 108 ] 109 110 111 ... 159

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