В этом коде у меня есть объект, содержащий две переменные - часы и минуты. Я пытаюсь последовательно добавить значение 15 минут и значение 20 минут к объекту с именем t1. Но я получаю сообщение об ошибке: слева от .plus должен быть класс / структура / объединение.
Заранее спасибо.
#include <iostream>
#include <iomanip>
using namespace std;
class Time {
public:
Time(int u, int m);
Time(int g);
void plus(Time t);
void plus(int x);
void print();
private:
int min;
int hour;
};
void Time::plus(Time t) {
min += t.min;
if (min > 59) {
hour++;
min = min - 60;
}
}
void Time::plus(int x) {
min += x;
if (min > 59) {
hour++;
min = min - 60;
}
}
void Time::print() {
cout << setw(2) << hour << " hour and " << min << " minutes";
}
Time::Time(int u, int m) : hour(u), min(m) {
}
Time::Time(int m) : hour(0), min(m) {
}
int main() {
Time t1(1, 10);
const Time kw(15);
t1.plus(kw).plus(20);
cout << "t1 = "; t1.print(); cout << endl;
cin.get();
return 0;
}
Прямо сейчас ваш plus
возвращает void
, или ничего! Значит, вы не можете сделать t1.plus(kw).plus(20);
. Если вы хотите, вам нужно, чтобы ваш .plus()
возвращал Time
:
class Time {
public:
Time &plus(Time t);
Time &plus(int x);
...
};
Я пошел дальше и заставил его возвращать Time
по ссылке, так что, когда вы связываете функцию, как вы, следующий plus
все еще изменяет исходный объект, на котором был вызван первый plus
! Мы можем сделать это, если вы реализуете такие функции plus
, как:
Time &Time::plus(Time t) {
min += t.min;
if (min > 59) {
hour++;
min = min - 60;
}
return *this; //return ourselves so that the next func will be called on us too!
}
Time &Time::plus(int x) {
min += x;
if (min > 59) {
hour++;
min = min - 60;
}
return *this; //return ourselves so that the next func will be called on us too!
}
Также: эту функцию чаще называют
operator+=
, а неplus
.