2017年10月23日
《その89》 インクルードガード(p.415演習11-5)
インクルードガード
ヘッダの二重インクルードによるエラーを防ぐのに、インクルードガードと呼ばれる手法が役立ちます。
【例1】
#if !defined ___XYZ
#define ___XYZ
ヘッダ部
#endif
【例2】
#ifndef ___XYZ
#define ___XYZ
ヘッダ部
#endif
例1や例2のように前処理指令(「 # 」で始まる指令 )を利用することで、二重インクルードを防止することができます。
マクロ名 ___XYZ は任意ですが、ヘッダごとに異なる名前にする必要があります。
新版明解C++入門編 p.415 演習11-5
日付(年・月・日)を読み込んで、その曜日を求めて表示するプログラムを作成せよ。
ここでの必要性はありませんが、ヘッダ部分をインクルードガードしました。
// Date.h
#ifndef ___Class_Date
#define ___Class_Date
#include <string>
#include <iostream>
class Date {
int y;
int m;
int d;
public:
Date();
Date(int yy, int mm = 1, int dd = 1);
int year() const { return y; }
int month() const { return m; }
int day() const { return d; }
std::string day_of_week() const;
Date preceding_day() const;
std::string to_string() const;
};
std::ostream& operator<<(std::ostream& s, const Date& x);
std::istream& operator>>(std::istream& s, Date& x);
#endif
// Date.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iomanip>
#include <ctime>
#include <sstream>
#include <iostream>
#include "Date.h"
using namespace std;
Date::Date() {
time_t current = time(NULL);
struct tm* local = localtime(&current);
y = local->tm_year + 1900;
m = local->tm_mon + 1;
d = local->tm_mday;
}
Date::Date(int yy, int mm, int dd) {
y = yy;
m = mm;
d = dd;
}
string Date::day_of_week() const {
string dw[] = { "日" ,"月", "火", "水", "木", "金", "土" };
int yy = y; int mm = m;
if (mm == 1 || mm == 2) {
yy--;
mm += 12;
}
return dw[(yy + yy / 4 - yy / 100 + yy / 400 + (13 * mm + 8) / 5 + d) % 7];
}
Date Date::preceding_day() const {
int dmax[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Date temp = *this;
if (temp.d > 1)
temp.d--;
else {
if (--temp.m < 1) {
temp.y--;
temp.m = 12;
}
temp.d = dmax[temp.m - 1];
}
return temp;
}
string Date::to_string() const {
ostringstream s;
s << setfill('0') << y << "年"
<< setw(2) << m << "月"
<< setw(2) << d << "日";
return s.str();
}
ostream& operator<<(ostream& s, const Date& x) {
return s << x.to_string();
}
istream& operator>>(istream& s, Date& x) {
int y, m, d; char c;
s >> y >> c >> m >> c >> d;
x = Date(y, m, d);
return s;
}
// DateTest.cpp
#include <iostream>
#include "Date.h"
using namespace std;
int main()
{
Date d;
cout << "今日は" << d << d.day_of_week() << "曜日\n";
cout << '\n';
cout << "西暦年月日を **/**/** 形式で入力 : ";
cin >> d;
cout << d << "は" << d.day_of_week() << "曜日\n";
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6887656
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック