在类中使用cout和两个表达式

时间:2014-10-26 10:37:33

标签: c++ class cout

我正在用C ++编写一个名为Time的类,该类有3个整数作为私有成员变量。我很擅长在C ++中使用类,并试图找出如何解决这个特定问题。问题在于,当我尝试这样做时:

cout << "Almost midnight: " << Time(0,0,0) - Time(0,0,1) << endl;

我遇到编译器错误,我认为这是因为带有3个参数的构造函数需要进行不同的编码,因为类中的私有变量从第一个构造函数中获取值,然后尝试从第二个构造函数中减去值构造函数,所以第一个值丢失(我相信)。那么构造函数如何保持旧值以便我可以进行减法而不将其存储在命名变量中。

这是我的代码:

#include <iostream>
#include <cctype>
#include <cstdlib>
using namespace std;

class Time
{
    private:
     int hours;
     int minutes;
     int seconds;
     void normalize();
    public:
     Time() {hours = minutes = seconds = 0; normalize();};
     Time(int x, int y, int z);
     friend Time operator + (const Time& t1, const Time& t2);
     friend Time operator - (const Time& t1, const Time& t2);
     friend bool operator < (const Time& t1, const Time& t2);
     friend istream& operator >>(istream& ins, Time& t1);
     friend ostream& operator <<(ostream& out, Time& t1);
};

Time::Time(int x, int y, int z)
{
    hours = x;
    minutes = y;
    seconds = z;

    normalize();
}

void Time::normalize()
{
    int s = seconds;
    int m = minutes;
    int h = hours;

    while(s < 0)
    {
        s += 60;
        m--;
    }

    while(m < 0)
    {
        m += 60;
        h--;
    }

    while(h < 0)
    {
        h = h + 24;
    }

    seconds = s % 60;
    minutes = (m + s/60) % 60;
    hours = (h + m/60 + s/3600) % 24;
}

istream& operator >>(istream& ins, Time& t1)
{
    ins >> t1.hours;
    ins >> t1.minutes;
    ins >> t1.seconds;

    t1.normalize();

    return ins;
}
ostream& operator <<(ostream& out, Time& t1)
{
    if(t1.hours < 10)
        out << '0' << t1.hours << ":";
    else
        out << t1.hours << ":";
    if(t1.minutes < 10)
        out << '0' << t1.minutes << ":";
    else
        out << t1.minutes << ":";
    if(t1.seconds < 10)
        out << '0' << t1.seconds;
    else
        out << t1.seconds;

    return out;
}

int main()
{
    Time t1, t2, t3, t4;
    cin >> t1;
    cin >> t2;
    cin >> t3;

    cout << "Time1: " << t1 << endl;
    cout << "Time2: " << t2 << endl;
    cout << "Time3: " << t3 << endl;

    t4 = t1 + t2;
    cout << "Time4: " << t4 << endl;

    t1 = t3 - t4;
    cout << "Time1: " << t1 << endl;

    if (t1 < t3)
        cout << "Time1 < Time3" << endl;
    else
        cout << "Time3 >= Time1" << endl;

    Time t5 = t2 + Time(0,0,1);
    if (t5 < t2)
        cout << "Time5 < Time2" << endl;
    else
        cout << "Time5 >= Time2" << endl;

    cout << "Almost midnight: " << Time(0,0,0) - Time(0,0,1) << endl;

    return 0;
}

Time operator + (const Time& t1, const Time& t2)
{
    Time temp;
    temp.hours = t1.hours + t2.hours;
    temp.minutes = t1.minutes + t2.minutes;
    temp.seconds = t1.seconds + t2.seconds;

    return temp;
}

Time operator - (const Time& t1, const Time& t2)
{
    Time temp;

    temp.hours = t1.hours - t2.hours;
    temp.minutes = t1.minutes - t2.minutes;
    temp.seconds = t1.seconds - t2.seconds;

    temp.normalize();

    return temp;
}

bool operator < (const Time& t1, const Time& t2)
{
    if(t1.hours < t2.hours && t1.minutes < t2.minutes && t1.seconds < t2.seconds)
        return true;
    else
        return false;
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

Time(0,0,0) - Time(0,0,1)给出一个临时对象(右值)

const Time&用于重载的<<运算符

friend ostream& operator <<(ostream& out, const Time& t1);
//                                        ~~~~ Use const