如何重载<<运算符基于已经定义的方法显示?

时间:2015-03-17 18:15:50

标签: operator-overloading

我想重载<<我已经定义的方法显示我的类的运算符。我得到一个与运算符<<不匹配的编译器错误。

这是一个最小的例子:

#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);没有问题!

1 个答案:

答案 0 :(得分:2)

您已将operator<<定义为MyClass成员函数。因此,你必须像调用成员函数一样调用它(左边的对象,右边的参数),如下所示:

C1 << cout;

但这似乎并不是你想要的。您可能希望能够像这样调用它:

cout << C1;

在这种情况下,该功能不能成为MyClass的成员。它必须是cout 自由函数(在任何类之外)的成员。在这种情况下,必须是一个免费功能,因为您无法更改cout的定义。

因此,要将operator<<声明为自由函数,它需要有两个参数(左侧和右侧):

ostream& operator<< (ostream& out, const MyClass& c) { ... }

现在你可以用左边的ostream和右边的MyClass对象来调用它,如下所示:

cout << C1;