我正在学习C ++,我正在研究重载<<。我使用下面的代码来打印课堂上的时间。它似乎与朋友功能一起使用,但是当我没有朋友使用时,它似乎导致错误" 不匹配运营商<< "。我在这做错了什么?以下是我的代码:
#include <iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
Time(int hh, int mm, int ss)
{
second = ss%60;
mm +=ss/60;
minute = mm%60;
hh +=mm/60;
hour = hh;
}
ostream& operator<<(ostream &out); //overloading << function declaration
};
ostream& Time::operator <<(ostream &out) // overloading << function definition
{
out << "Time - " << hour << ":" << minute << ":" << second;
return out;
}
int main()
{
using namespace std;
Time tm(10,36,60);
cout << tm;
return 0;
}
答案 0 :(得分:1)
功能
ostream& operator<<(ostream &out);
定义<<
,使得LHS是Time
个对象,RHS是std::ostream
个对象。
可以用作:
Time tm(10,36,60);
tm << cout;
不是
cout << tm;
使用
cout << tm;
您需要定义一个LHS类型为std::ostream
的函数。因此,它不能是Time
的成员函数。
将函数声明为:
friend ostream& operator<<(ostream &out, Time const& ti);
并相应地实施它。
答案 1 :(得分:1)
当您有成员运算符重载时,运算符的左侧是该类的对象。所以你的成员:
ostream& operator<<(ostream &out);
实际上会匹配用法:
tm << cout
但不是cout << tm
。
要解决此问题,您应该使用非成员函数。我的首选方式是:
// not inside a class definition
ostream &operator<<(ostream &os, Time const &tm)
{
// output using public methods of tm
return os;
}
然而,另一种常见技术是使用友元功能:
// Inside Time's class definition
friend ostream &operator<<(ostream &os, Time const &tm)
{
// output using private members of tm
return os;
}
请注意,即使后者出现在类定义中,它实际上也不是成员函数。 friend
关键字就是这样。