C++/Overload/Inserter
Содержание
An inserter can be used to output data in any form
<source lang="cpp">
- include <iostream>
using namespace std; class MyClass {
int x, y;
public:
MyClass(int i, int j) { x=i; y=j; } friend ostream &operator<<(ostream &stream, MyClass o);
}; ostream &operator<<(ostream &stream, MyClass o) {
register int i, j; for(i=0; i<o.x; i++) stream << "*"; stream << "\n"; for(j=1; j<o.y-1; j++) { for(i=0; i<o.x; i++) if(i==0 || i==o.x-1) stream << "*"; else stream << " "; stream << "\n"; } for(i=0; i<o.x; i++) stream << "*"; stream << "\n"; return stream;
} int main() {
MyClass a(14, 6), b(30, 7), c(40, 5); cout << "Here are some:\n"; cout << a << b << c; return 0;
}
</source>
Create a non-friend inserter.
<source lang="cpp">
- include <iostream>
using namespace std; class MyClass { public:
int x, y; // must be public MyClass() { x = 0; y = 0; } MyClass(int i, int j) { x = i; y = j; }
}; // An inserter for the MyClass class. ostream &operator<<(ostream &stream, MyClass ob) {
stream << ob.x << ", " << ob.y << "\n"; return stream;
} int main() {
MyClass a(1, 1), b(10, 23); cout << a << b; return 0;
}
</source>
Output account info to a file using an inserter.
<source lang="cpp">
- include <iostream>
- include <fstream>
- include <cstring>
using namespace std; class account {
int custnum; char name[80]; double balance;
public:
account(int c, char *n, double b) { custnum = c; strcpy(name, n); balance = b; } friend ostream &operator<<(ostream &stream, account ob);
}; ostream &operator<<(ostream &stream, account ob) {
stream << ob.custnum << " "; stream << ob.name << " " << ob.balance; stream << "\n"; return stream;
} int main() {
account Rex(1011, "Joe", 12323.34); ofstream out("accounts", ios::out | ios::binary); if(!out) { cout << "Cannot open output file.\n"; return 1; } out << Rex; out.close(); return 0;
}
</source>
PhoneNumber inserter function
<source lang="cpp">
- include <iostream>
- include <cstring>
using namespace std; class PhoneNumber { public:
char name[80]; int areaCode; int prefix; int num; PhoneNumber(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, PhoneNumber o) {
stream << o.name << " "; stream << "(" << o.areaCode << ") "; stream << o.prefix << "-" << o.num << "\n"; return stream; // must return stream
} int main() {
PhoneNumber a("T", 111, 555, 1234); PhoneNumber b("A", 312, 555, 5768); PhoneNumber c("T", 212, 555, 9991); cout << a << b << c; return 0;
}
</source>
This program draws right triangles
<source lang="cpp">
- include <iostream>
using namespace std; class triangle {
int height, base;
public:
triangle(int h, int b) { height = h; base = b; } friend ostream &operator<<(ostream &stream, triangle ob);
}; // Draw a triangle. ostream &operator<<(ostream &stream, triangle ob) {
int i, j, h, k; i = j = ob.base-1; for(h=ob.height-1; h; h--) { for(k=i; k; k--) stream << " "; stream << "*"; if(j!=i) { for(k=j-i-1; k; k--) stream << " "; stream << "*"; } i--; stream << "\n"; } for(k=0; k<ob.base; k++) stream << "*"; stream << "\n"; return stream;
} int main() {
triangle t1(5, 5), t2(10, 10), t3(12, 12); cout << t1; cout << endl << t2 << endl << t3; return 0;
}
</source>
Use a friend inserter for objects of type MyClass.
<source lang="cpp">
- include <iostream>
using namespace std; class MyClass {
int x, y;
public:
MyClass() { x = 0; y = 0; } MyClass(int i, int j) { x = i; y = j; } friend ostream &operator<<(ostream &stream, MyClass ob);
}; ostream &operator<<(ostream &stream, MyClass ob) {
stream << ob.x << ", " << ob.y << "\n"; return stream;
} int main() {
MyClass a(1, 1), b(10, 23); cout << a << b; return 0;
}
</source>
Use friend function to operator: <<, >>
>" src="http://www.java2s.com/Code/CppImages/Usefriendfunctiontooperator.PNG">
<source lang="cpp">
- include <iostream>
using namespace std; class factor {
int num; // number int lfact; // lowest factor
public:
factor(int i); friend ostream &operator<<(ostream &stream, factor ob); friend istream &operator>>(istream &stream, factor &ob);
}; factor::factor(int i) {
int n; num = i; for(n=2; n < (i/2); n++) if(!(i%n)) break; if(n<(i/2)) lfact = n; else lfact = 1;
} istream &operator>>(istream &stream, factor &ob) {
stream >> ob.num; int n; for(n=2; n < (ob.num/2); n++) if(!(ob.num%n)) break; if(n < (ob.num/2)) ob.lfact = n; else ob.lfact = 1; return stream;
} ostream &operator<<(ostream &stream, factor ob) {
stream << ob.lfact << " is lowest factor of "; stream << ob.num << "\n"; return stream;
} int main() {
factor o(32); cout << o; cin >> o; cout << o; return 0;
}
</source>