我有点困惑如何在C++中为我的类重载流运算符,因为它们似乎是流类上的函数,而不是在我的类上。那么正常的做法是什么呢?目前,对于“获取自”运算符,我有一个定义:
istream& operator>>(istream& is, Thing& thing) { // etc...
这个方法可以正常工作。在Thing类的定义中没有提到它。我希望它能够在实现中访问我的Thing类的成员 - 我该怎么做?
我有点困惑如何在C++中为我的类重载流运算符,因为它们似乎是流类上的函数,而不是在我的类上。那么正常的做法是什么呢?目前,对于“获取自”运算符,我有一个定义:
istream& operator>>(istream& is, Thing& thing) { // etc...
这个方法可以正常工作。在Thing类的定义中没有提到它。我希望它能够在实现中访问我的Thing类的成员 - 我该怎么做?
Thing
中声明你的运算符为friend
:class Thing {
public:
friend istream& operator>>(istream&, Thing&);
...
}
class MyClass {
int x, y;
public:
MyClass(int i, int j) {
x = i;
y = j;
}
friend ostream &operator<<(ostream &stream, MyClass ob);
friend istream &operator>>(istream &stream, MyClass &ob);
};
ostream &operator<<(ostream &stream, MyClass ob)
{
stream << ob.x << ' ' << ob.y << '\n';
return stream;
}
istream &operator>>(istream &stream, MyClass &ob)
{
stream >> ob.x >> ob.y;
return stream;
}
operator>>
声明为 Thing 类的友元。有几种方法可供选择,正确的方法取决于类的功能。
通常情况下,具有公共API以允许读取信息是有意义的,在这种情况下,流操作符不需要访问私有成员。
可能最受欢迎的方法是将流函数声明为类的友元函数。
我最喜欢的方法是提供一个公共的Boost.Serialization风格的模板函数,可以用于任何方向的数据流,并且还可以用于其他事情。