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

Операции извлечения и вставки

Читайте также:
  1. I. Психологические операции в современной войне.
  2. Активные операции коммерческих банков: понятие, значение, характеристика видов
  3. Арифметические выражения и операции
  4. Арифметические операции
  5. Арифметические операции и выражения
  6. Арифметические операции над двоично-десятичными числами
  7. Арифметические операции языка С
  8. Б. Операции на рынке иностранной валюты
  9. Банковская система. Банки и их операции.
  10. БАНКОВСКИЕ ОПЕРАЦИИ
  11. Булевы операции
  12. Булевы операции

Одним из главных преимуществ потоков ввода-вывода является их расширяемость для новых типов данных. Можно реализовать операции извлечения и вставки для своих собственных типов данных. Чтобы избежать неожиданностей, ввод-вывод для определенных пользователем типов данных должен следовать тем же соглашениям, которые используются операциями извлечения и вставки для встроенных типов данных. Рассмотрим пример перегрузки операций извлечения и вставки в поток для определенного пользователем типа данных, которым является следующий класс даты:

class Date {
public:
Date(int d, int m, int y);
Date(const tm & t);
Date();
private:
tm tm_date;
};

Этот класс содержит член типа tm, который представляет собой структуру для хранения даты и времени, определенную в заголовочном файле time.h. Чтобы осуществить ввод-вывод пользовательского типа данных, какими являются объекты класса Date, нужно перегрузить операции извлечения и вставки в поток для этого класса. Приведем соответствующее объявление класса Date:

class Date {
tin tm_date;
friend istream& operator>> (istreamfi is, Date dat);
friend ostream& operator<< (ostream& os, const Date& dat);
public:
Date(int d, int m, int y);
Date(tm t);
Date();
tin tm_date;
friend istream& operator>> (istreamfi is, Date dat);
friend ostream& operator<< (ostream& os, const Date& dat);
};

Реализуем операции извлечения и вставки для объектов класса Date.

Возвращаемым значением для операции извлечения (и вставки) должна являться ссылка на поток, чтобы несколько операций могли быть выполнены в одном выражении. Первым параметром должен быть поток, из которого будут извлекаться данные, вторым параметром - ссылка или указатель на объект определенного пользователем типа. Чтобы разрешить доступ к закрытым данным класса, операция извлечения должна быть объявлена как дружественная функция класса. Ниже приведена операция извлечения из потока для класса Date:

istream.& operator>>(istream& is, Date& dat){
is >> dat.tm_date.tm_mday;
is >> dat.tm_date.tm_mon;
is >> dat.tm_date.tm_year;
return is;
}

Те же самые замечания верны и для операции вставки. Она может быть построена аналогично. Единственное отличие заключается в том, что в нее нужно передать константную ссылку на объект типа Date, поскольку операция вставки не должна модифицировать выводимые объекты. Ниже приведена ее реализация для класса Date:

osiream& operator<<(ostream& os, const Date& dat){
os << dat.tm_date.tm_mday << '/';
os << dat.tm_date.tin_mon << '/';
os << dat.tm_date.tm_year;
return os;
}

Следуя соглашениям о вводе-выводе для потоков, теперь можно осуществлять извлечение и вставку объектов класса Date следующим образом:

Date birthday(24,10,1985);
cout << birthday << '\n';
или

Date date;
cout << "Пожалуйста, введите дату (день, месяц, год)\n";
cin >> date;
cout << date << '\n';

Приведем теперь пример полностью:

#include < iostream.h >
#include < time.h >
class Date {
tm tm_date;
public:
Date(int d, int m, int y) {
tm_date.tm_mday = d; tm_date.tm_mon = m; tm_date.tm_year = y;
};
Date (tm t){tm_date = t;};
Date() { tm_date.tm_mday = 01;
tm_date.tm_mon = 00;
tm_date.tm_year = 00; }
friend ostream& operator<< (ostream& os, const Date& dat);
friend istream& operator>> (istream& is, Date& dat);
};
istream& operator>>(istream& is, Date& dat){
is >> dat.tm_date.tm_mday;
is >> dat.tm_date.tm_mon;
is >> dat.tm_date.tm_year;
return is;
}
ostream& operator<< (ostream& os,const Date& dat){
os << dat.tm_date.tm_mon << '/';
os << dat.tm_date.tm_mday << '/';
os << dat. tm_date. tm_year;
return os;
}

void main(){ Date date;
cout << "Пожалуйста, введите дату (день, месяц, год)\n";
cin >> date;
cout << date << '\n';
}

Приведем еще один пример, демонстрирующий перегрузку операций извлечения и вставки в поток, на этот раз для структуры:

struct info {
char *name;
double val;
char *units;
info(){
val=0;
name = new char [30];
units = new char [30];
name[0]=units[0]=0;
}};
ostream& operator << (ostream& s, info &m){ // Вывод info в s
s << m.name << " "<< m.val <<" "<< m.units<< "\n";
return s;}

Oперация >> может быть перегружена следующим образом:

istream& operator >> (istream& s, info &m){ // Ввод в info
s.width(30); s >> m.name;
char c;
while((c = s.get())!= ' ' && c!='\t' && c!='\n');
s.putback(c);
s.width(30);
s >> m.val;
s.width(30);
s >> m.units;
return s;
}

Для считывания строки ввода, такой как "Resistance 300 Ohm", можно использовать следующую запись:

void main(){
clrscr();
info m;
cout<< "Введите наименование величины, ее значение \n";
cout<< " и единицу измерения (и нажмите Enter.):\n";
cin >> m; // Переопределенная операция >>
cout << m; // Переопределенная операция <<
}

 


1 | 2 | 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 | 49 | 50 | 51 | 52 | 53 | 54 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)