将cout与类中的两个表达式一起使用

Using cout with two expressions in a class

本文关键字:两个 表达式 一起 cout      更新时间:2023-10-16

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

提前谢谢。

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

对过载的<<操作员使用const Time&

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