2017年11月02日
《その103》 演算子関数の一般的な定義の形式(p.455演習12-3)
単項演算子関数と2項演算子関数の一般的な定義の形式を確認しておきます。
// ヘッダ--------------------------------
class C {
・・・
public:
・・・
C operator☆() { ・・・ }
C operator△(const C& x) { ・・・ }
・・・
};
inline C operator★(const C& x) { ・・・ }
inline C operator▲(const C& x, const C& y) { ・・・ }
// ------------------------------------
operator☆ は単項演算子関数(メンバ関数)
operator★ は単項演算子関数(非メンバ関数)
operator△ は2項演算子関数(メンバ関数)
operator▲ は2項演算子関数(非メンバ関数)
新版明解C++入門編 p.455 演習12-3
演習11-3(このブログの《その86》)で作成した時刻クラスに、各種の演算子関数を追加せよ。仕様などは自分で考えること。
// Time.h
#ifndef ___Class_Time
#define ___Class_Time
#include <iostream>
class Time {
int hour;
int minute;
int second;
public:
Time();
Time(int h, int m = 0, int s = 0);
int get_hour() const { return hour; }
int get_minute() const { return minute; }
int get_second() const { return second; }
// hour を進める。
void forward_h(int h);
// minute を進める。
void forward_m(int m);
// second を進める。
void forward_s(int s);
// 時・分・秒の値を調整。
void adjust(int &h, int &m, int &s);
// ○時間○分○秒後の時刻を求める。
Time& operator+=(const Time& x);
// ○時間○分○秒前の時刻を求める。
Time& operator-=(const Time& x);
// 時刻と時刻の時間差を求める。
friend Time operator-(const Time& x, const Time& y);
};
std::ostream& operator<<(std::ostream& so, const Time& x);
std::istream& operator>>(std::istream& si, Time& x);
#endif
// Time.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iomanip>
#include <ctime>
#include <sstream>
#include "Time.h"
using namespace std;
Time::Time() {
time_t current = time(NULL);
struct tm* local = localtime(¤t);
hour = local->tm_hour;
minute = local->tm_min;
second = local->tm_sec;
}
Time::Time(int h, int m, int s)
: hour(h), minute(m), second(s) {
adjust(h, m, s);
hour = h; minute = m; second = s;
}
void Time::forward_h(int h) {
hour = (hour + h) % 24;
}
void Time::forward_m(int m) {
m = minute + m;
adjust(hour, m, second);
}
void Time::forward_s(int s) {
s = second + s;
adjust(hour, minute, s);
}
void Time::adjust(int &h, int &m, int &s) {
while (s < 0)
s += 60, m--;
while (m < 0)
m += 60, h--;
while (h < 0)
h += 24;
m = m + s / 60;
s = s % 60;
h = h + m / 60;
m = m % 60;
h = h % 24;
hour = h; minute = m; second = s;
}
Time& Time::operator+=(const Time& x) {
this->adjust(hour += x.hour,
minute += x.minute,
second += x.second);
return *this;
}
Time& Time::operator-=(const Time& x) {
this->adjust(hour -= x.hour,
minute -= x.minute,
second -= x.second);
return *this;
}
Time operator-(const Time& x, const Time& y) {
Time temp(x.hour - y.hour,
x.minute - y.minute,
x.second - y.second
);
return temp;
}
ostream& operator<<(ostream& so, const Time& x) {
return so << setfill('0')
<< setw(2) << x.get_hour() << "時(時間)"
<< setw(2) << x.get_minute() << "分"
<< setw(2) << x.get_second() << "秒";
}
istream& operator>>(istream& si, Time& x) {
int h, m, s; char c;
si >> h >> c >> m >> c >> s;
x = Time(h, m, s);
return si;
}
// TimeTest.cpp
#include <iostream>
#include "Time.h"
using namespace std;
int main() {
Time a1;
Time a2 = a1;
Time a3 = a1;
cout << "現在時刻 : " << a1 << '\n';
/* 演算子関数とは無関係なので、ここではコメントアウトしておきます。
cout << '\n';
cout << "**:**:**形式で時刻を入力 : "; cin >> a;
cout << a << '\n';
a.forward_h(20); cout << a << "( 20時間進めました。)" << '\n';
a.forward_m(80); cout << a << "( 80分 進めました。)" << '\n';
a.forward_s(3700); cout << a << "( 3700秒進めました。)" << '\n';
*/
Time t1, t2, t3;
cout << "\n◆ **時間**分**秒後の時刻を求めます。\n";
cout << " **:**:**形式で時間を入力 … "; cin >> t1;
cout << (a1 += t1) << "です。\n";
cout << "\n◆ **時間**分**秒前の時刻を求めます。\n";
cout << " **:**:**形式で時間を入力 … "; cin >> t2;
cout << (a2 -= t2) << "です。\n";
cout << "\n◆ 現在時刻との時間差を求めます。\n" ;
cout << " **:**:**形式で時刻を入力 … "; cin >> t3;
cout << "それは " << t3 - a3 << " 後か、\n";
cout << "または " << a3 - t3 << " 前です。\n";
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6925173
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック