如何根据已定义的方法显示重载 << 运算符?
How to overload the << operator based on a method display already defined?
我想从已定义的方法显示中为我的 class 重载 << 运算符。我收到一个编译器错误,不匹配运算符 <<。
这是一个最小的例子:
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{}
ostream& display(ostream& out) const
{
out << "Display message" << endl;
return out;
}
ostream& operator<< (ostream& out) const
{
ostream& output = display(out);
return output;
}
};
int main()
{
MyClass C1;
cout << C1 << endl;
return 0;
}
虽然 C1.display(cout);
没有问题!
您已将 operator<<
定义为 MyClass
的 成员函数 。因此,必须像调用成员函数一样调用它(左边是对象,右边是参数),像这样:
C1 << cout;
但这似乎不是你想要的。您可能希望能够这样称呼它:
cout << C1;
在那种情况下,函数不能是 MyClass
的成员。它必须是 cout
、 或 一个 自由函数 的成员(在任何 class 之外)。在这种情况下,它 必须 是一个自由函数,因为您不能更改 cout
.
的定义
因此,要将 operator<<
声明为自由函数,它需要有两个参数(左侧和右侧):
ostream& operator<< (ostream& out, const MyClass& c) { ... }
现在你可以用左边的 ostream
和右边的 MyClass
对象来调用它,像这样:
cout << C1;
我想从已定义的方法显示中为我的 class 重载 << 运算符。我收到一个编译器错误,不匹配运算符 <<。
这是一个最小的例子:
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass()
{}
ostream& display(ostream& out) const
{
out << "Display message" << endl;
return out;
}
ostream& operator<< (ostream& out) const
{
ostream& output = display(out);
return output;
}
};
int main()
{
MyClass C1;
cout << C1 << endl;
return 0;
}
虽然 C1.display(cout);
没有问题!
您已将 operator<<
定义为 MyClass
的 成员函数 。因此,必须像调用成员函数一样调用它(左边是对象,右边是参数),像这样:
C1 << cout;
但这似乎不是你想要的。您可能希望能够这样称呼它:
cout << C1;
在那种情况下,函数不能是 MyClass
的成员。它必须是 cout
、 或 一个 自由函数 的成员(在任何 class 之外)。在这种情况下,它 必须 是一个自由函数,因为您不能更改 cout
.
因此,要将 operator<<
声明为自由函数,它需要有两个参数(左侧和右侧):
ostream& operator<< (ostream& out, const MyClass& c) { ... }
现在你可以用左边的 ostream
和右边的 MyClass
对象来调用它,像这样:
cout << C1;