Эти сообщения об ошибках
| 17 | error: 'minutes' не было объявлено в этой области |
| 18 | ошибка: «часы» не были объявлены в этой области |
означает, что в этом определении функции
Time operator+(const Time & t)
{
Time sum;
sum.minutes = minutes + t.minutes;
^^^^^^^
sum.hours = hours + t.hours + sum.minutes / 60;
^^^^^
sum.minutes %= 60;
return sum;
}
переменные minutes
и hours
не объявлены. Функция не является функцией-членом класса. Таким образом, эти переменные не являются членами данных объекта класса Time
. Они являются необъявленными идентификаторами.
Функции-друзья не получают неявный аргумент this
, как это делают нестатические c функции класса-члена.
Эти сообщения об ошибках
| 24 | ошибка: «минуты» не были объявлены в этой области |
| 24 | ошибка: «минуты» не были объявлены в этой области |
имеют то же самое смысл. Функция x
не является функцией-членом класса Time.
Если функция друга operator +
перегружает двоичный оператор +
, то она должна иметь два параметра.
Что касается второй функции-друга, то, похоже, ее задача состоит в том, чтобы установить значения для объекта типа Time
.
Функции-друзья должны быть объявлены и определены следующим образом: показано в демонстрационной программе ниже.
#include <iostream>
#include <iomanip>
class Time
{
int hours;
int minutes;
friend Time operator +( const Time &t1, const Time &t2 );
friend void x( Time &t, int h, int m );
friend std::ostream & operator <<( std::ostream &is, const Time &t );
};
Time operator +( const Time &t1, const Time &t2 )
{
const int HOURS_IN_DAY = 24;
const int MINUTES_IN_HOUR = 60;
Time t;
t.hours = t1.hours + t2.hours + ( t1.minutes + t2.minutes ) / MINUTES_IN_HOUR;
t.hours %= HOURS_IN_DAY;
t.minutes = ( t1.minutes + t2.minutes ) % MINUTES_IN_HOUR;
return t;
}
void x( Time &t, int h, int m )
{
t.hours = h;
t.minutes = m;
}
std::ostream & operator <<( std::ostream &os, const Time &t )
{
return
os << std::setw( 2 ) << std::setfill( '0' ) << t.hours
<< ':'
<< std::setw( 2 ) << std::setfill( '0' ) << t.minutes;
}
int main()
{
Time t1;
x( t1, 16, 10 );
std::cout << t1 << '\n';
Time t2;
x( t2, 10, 20 );
std::cout << t2 << '\n';
std::cout << t1 + t2 << '\n';
return 0;
}
Вывод программы:
16:10
10:20
02:30