重载时出错<&lt ;.我在这做错了什么?

时间:2015-11-30 05:56:23

标签: c++ function class io operator-overloading

我正在学习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;
}

2 个答案:

答案 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关键字就是这样。