class Time
{
private:
int hour;
int min;
int sec;
public:
Time();
Time(int h, int m, int s)
{
hour = h;
min = m;
sec = s;
}
Time operator*(double t)
{
Time sum;
int tolsec = sec + t.sec;
int tolmin = tolsec / 60 + min + t.min;
sum.hour = tolmin / 60 + hour + t.hour;
sum.min = tolmin % 60;
sum.sec = tolsec % 60;
return sum;
}
}
Time operator*(double t2,const Time& t1)
{
return t1 * t2;
}
代码中的问题是,在定义友元函数operator*时,参数t1的类型是const Time &,但是在调用t1 * t2时,t1是一个对象而不是一个引用,所以编译器无法找到可以接受对象的左操作数的运算符。
解决方法是将t1的类型改为对象,即
Time operator*(double t2, Time t1)
{
return t1 * t2;
}
如果原来的t1是一个常量对象,那么就不能通过友元函数修改它的值了。如果希望保留对常量对象的修改能力,可以将t1的类型改为常量引用。