C++ Tutorial/Operator Overloading/overload ostream istream operator — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
|
(нет различий)
|
Версия 14:21, 25 мая 2010
Содержание
- 1 Class level ostream operator and istream operator
- 2 Class ostream operator
- 3 Complex logic in ostream operator
- 4 friend ostream operator for private fields
- 5 Ignore: manipulator that ignores N lines
- 6 istream operator with data check
- 7 ostream and istream operator for a class
- 8 Overloading >>: To demonstrate a custom inserter, one will be created for objects of type phonebook, shown here.
- 9 Overload
- 10 Overload ostream and istream operator
Class level ostream operator and istream operator
#include<iostream.h>
#include<fstream.h>
class ThreeD
{
int x,y,z;
public:
ThreeD(int i,int j,int k){
x=i;
y=j;
z=k;
}
friend ostream& operator<<(ostream& stream,ThreeD ob);
friend istream& operator>>(istream& stream,ThreeD ob);
};
ostream& operator<<(ostream& stream,ThreeD ob)
{
stream<<ob.x<<" "<<ob.y<<" "<<ob.z<<"\n";
return stream;
}
istream& operator>>(istream& stream,ThreeD ob)
{
stream>>ob.x>>ob.y>>ob.z;
return stream;
}
main()
{
ThreeD o1(1,2,3),o2(4,5,6);
ofstream out("test");
if(!out)
{
cout<<"Cannot open output file\n";
return 1;
}
cout<<o1<<o2;
out.close();
ifstream in("test");
if(!in)
{
cout<<"Cannot open input file\n";
return 1;
}
ThreeD o3(0,0,0),o4(0,0,0);
in>>o3>>o4;
return 0;
}
1 2 3 4 5 6
Class ostream operator
#include <iostream>
#include <cstring>
using namespace std;
class MyClass {
public:
char name[80];
int areacode;
int prefix;
int num;
MyClass(char *n, int a, int p, int nm)
{
strcpy(name, n);
areacode = a;
prefix = p;
num = nm;
}
};
ostream &operator<<(ostream &stream, MyClass o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-" << o.num << "\n";
return stream;
}
int main()
{
MyClass a("T", 1, 5, 1);
MyClass b("A", 3, 5, 5);
MyClass c("T", 2, 5, 9);
cout << a << b << c;
return 0;
}
T (1) 5-1 A (3) 5-5 T (2) 5-9
Complex logic in ostream operator
#include <iostream>
using namespace std;
class Line {
int x;
public:
Line(int i) { x=i; }
friend ostream &operator<<(ostream &stream, Line o);
};
ostream &operator<<(ostream &stream, Line o)
{
register int i, j;
for(i=0; i<o.x; i++)
stream << "*";
stream << "\n";
return stream;
}
int main()
{
Line a(14), b(30), c(40);
cout << a << b << c;
return 0;
}
************** ****************************** ****************************************
friend ostream operator for private fields
#include <iostream>
#include <cstring>
using namespace std;
class MyClass {
// now private
char name[80];
int areacode;
int prefix;
int num;
public:
MyClass(char *n, int a, int p, int nm)
{
strcpy(name, n);
areacode = a;
prefix = p;
num = nm;
}
friend ostream &operator<<(ostream &stream, MyClass o);
};
ostream &operator<<(ostream &stream, MyClass o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-" << o.num << "\n";
return stream;
}
int main() {
MyClass a("T", 1, 5, 1);
MyClass b("A", 3, 5, 5);
MyClass c("T", 2, 5, 9);
cout << a << b << c;
return 0;
}
T (1) 5-1 A (3) 5-5 T (2) 5-9
Ignore: manipulator that ignores N lines
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <limits>
// Ignore: manipulator that ignores N lines
class Ignore {
public:
int num;
Ignore(int n) : num(n) {
}
};
// convenience function
Ignore ignore(int n)
{
return Ignore(n);
}
std::istream& operator >> (std::istream& strm, const Ignore& manip)
{
for (int i=0; i<manip.num; ++i) {
strm.ignore(std::numeric_limits<int>::max(),"\n");
}
return strm;
}
int main()
{
char c;
std::cout << "ignore two lines and print frist character following them\n";
std::cin >> ignore(2) >> c;
std::cout << "c: " << c << std::endl;
}
ignore two lines and print frist character following them a v a c: a
istream operator with data check
#include<iostream.h>
class Time
{
int hour;
int minute;
int second;
public:
friend ostream& operator<<( ostream &, Time);
friend istream& operator>>( istream &,Time &);
};
ostream& operator<<( ostream & out, Time t)
{
out<<"\nHere"s the time:\n";
out<<t.hour<<":"<<t.minute<<":"<<t.second<<"\n";
return out;
}
istream& operator>>( istream & in ,Time & t)
{
cout<<"Please enter the time as follow\n";
do{
cout<<"What is the hour(0-23)?";
in>>t.hour;
if((t.hour<0)||(t.hour>23))
cout<<"You have inpitted a wrong data! Please try again!\n";
}while((t.hour<0)||(t.hour>23));
do{
cout<<"What is the minute(0-59)?";
in>>t.minute;
if((t.minute<0)||(t.minute>59))
cout<<"You have inpitted a wrong data! Please try again!\n";
}while((t.minute<0)||(t.minute>59));
do{
cout<<"What is the second(0-23)?";
in>>t.second;
if((t.second<0)||(t.second>59))
cout<<"You have inpitted a wrong data! Please try again!\n";
}while((t.second<0)||(t.second>59));
return in;
}
main()
{
Time now;
cin>>now;
cout<<now;
return 0;
}
Please enter the time as follow What is the hour(0-23)?12 What is the minute(0-59)?12 What is the second(0-23)?12 Here"s the time: 12:12:12
ostream and istream operator for a class
#include <iostream>
#include <cstring>
using namespace std;
class MyClass {
char name[80];
int id;
int prefix;
int value;
public:
MyClass() { };
MyClass(char *n, int a, int p, int nm)
{
strcpy(name, n);
id = a;
prefix = p;
value = nm;
}
friend ostream &operator<<(ostream &stream, MyClass o);
friend istream &operator>>(istream &stream, MyClass &o);
};
// Display name and phone valueber.
ostream &operator<<(ostream &stream, MyClass o)
{
stream << o.name << " ";
stream << "(" << o.id << ") ";
stream << o.prefix << "-" << o.value << "\n";
return stream; // must return stream
}
// Input name and telephone valueber.
istream &operator>>(istream &stream, MyClass &o)
{
cout << "Enter name: ";
stream >> o.name;
cout << "Enter id: ";
stream >> o.id;
cout << "Enter prefix: ";
stream >> o.prefix;
cout << "Enter value: ";
stream >> o.value;
cout << "\n";
return stream;
}
int main()
{
MyClass a;
cin >> a;
cout << a;
return 0;
}
Enter name: Joe Enter id: 123 Enter prefix: 1 Enter value: 2 Joe (123) 1-2
Overloading >>: To demonstrate a custom inserter, one will be created for objects of type phonebook, shown here.
#include <iostream>
#include <cstring>
using namespace std;
class phonebook {
public:
char name[80];
int areacode;
int prefix;
int num;
phonebook(char *n, int a, int p, int nm)
{
strcpy(name, n);
areacode = a;
prefix = p;
num = nm;
}
};
// Display name and phone number.
ostream &operator<<(ostream &stream, phonebook o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-" << o.num << "\n";
return stream; // must return stream
}
int main()
{
phonebook a("A", 111, 555, 1234);
phonebook b("B", 312, 555, 5768);
phonebook c("C", 212, 555, 9991);
cout << a << b << c;
return 0;
}
Overload
#include <iostream>
#include <cstring>
using namespace std;
class phonebook {
// now private
char name[80];
int areacode;
int prefix;
int num;
public:
phonebook(char *n, int a, int p, int nm)
{
strcpy(name, n);
areacode = a;
prefix = p;
num = nm;
}
friend ostream &operator<<(ostream &stream, phonebook o);
};
// Display name and phone number.
ostream &operator<<(ostream &stream, phonebook o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-" << o.num << "\n";
return stream; // must return stream
}
int main()
{
phonebook a("A", 111, 555, 1234);
phonebook b("B", 312, 555, 5768);
phonebook c("C", 212, 555, 9991);
cout << a << b << c;
return 0;
}
Overload ostream and istream operator
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class MyClass {
char name[80];
char areacode[4];
char prefix[4];
char num[5];
public:
MyClass() { };
MyClass(char *n, char *a, char *p, char *nm)
{
strcpy(name, n);
strcpy(areacode, a);
strcpy(prefix, p);
strcpy(num, nm);
}
friend ostream &operator<<(ostream &stream, MyClass o);
friend istream &operator>>(istream &stream, MyClass &o);
};
// Display name and phone number.
ostream &operator<<(ostream &stream, MyClass o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-";
stream << o.num << "\n";
return stream; // must return stream
}
// Input name and telephone number.
istream &operator>>(istream &stream, MyClass &o)
{
cout << "Enter name: ";
stream >> o.name;
cout << "Enter area code: ";
stream >> o.areacode;
cout << "Enter prefix: ";
stream >> o.prefix;
cout << "Enter number: ";
stream >> o.num;
cout << "\n";
return stream;
}
int main()
{
MyClass a;
char c;
fstream pb("phone", ios::in | ios::out | ios::app);
if(!pb) {
cout << "Cannot open phone book file.\n";
return 1;
}
cin >> a;
pb << a; // write to disk
char ch;
pb.seekg(0, ios::beg);
while(!pb.eof()) {
pb.get(ch);
if(!pb.eof()) cout << ch;
}
pb.clear(); // reset eof
cout << endl;
pb.close();
}
Cannot open phone book file.