我对如何在 C++ 中为我的类重载流运算符有点困惑,因为它们似乎是流类上的函数,而不是我的类上的函数。这样做的正常方法是什么?目前,对于“get from”运算符,我有一个定义
istream& operator>>(istream& is, Thing& thing) { // etc...
哪个有效。Thing 类的定义中没有提到它。我希望它能够在其实现中访问我的 Thing 类的成员 - 我该怎么做?
我对如何在 C++ 中为我的类重载流运算符有点困惑,因为它们似乎是流类上的函数,而不是我的类上的函数。这样做的正常方法是什么?目前,对于“get from”运算符,我有一个定义
istream& operator>>(istream& is, Thing& thing) { // etc...
哪个有效。Thing 类的定义中没有提到它。我希望它能够在其实现中访问我的 Thing 类的成员 - 我该怎么做?
你的实现很好。您需要执行的唯一额外步骤是将您的运算符声明为friend
in Thing
:
class Thing {
public:
friend istream& operator>>(istream&, Thing&);
...
}
其他答案都是对的。如果它对您有帮助,这里有一个代码示例(source):
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 是有意义的,在这种情况下,流式运营商不需要访问私有 API。
可能最流行的方法是将流函数声明为类的朋友。
我最喜欢的是提供一个公共的 Boost.Serialization 样式模板函数,它可以用于流式传输,也可以用于其他事情。