2017年12月07日
《その166》 データメンバへのポインタ & p.133演習3-13
クラスのデータメンバへのポインタ
データメンバへのポインタは、メンバ関数のときと同じ形式で宣言します。
次のプログラムで確認してください。
// ------------------------------------
#include <iostream>
class C {
public:
char chr;
C() { chr = 'a'; }
char ch() { return chr; }
};
C c;// C型のクラスオブジェクト c を作る。
int main() {
char C::*ptr_c; // データメンバへのポインタ ptr_c の宣言
char (C::*ptr_f)(); // メンバ関数へのポインタ ptr_f の宣言
ptr_c = &C::chr;
// ポインタ ptr_c がデータメンバ C::chr を指すように設定
ptr_f = &C::ch;
// ポインタ ptr_f がメンバ関数 C::ch を指すように設定
std::cout << (c.*ptr_f)() << '\n';
// std::cout << c.ch() << '\n'; と同じこと
c.*ptr_c = 'b';
// c.chr = 'b'; と同じこと
std::cout << (c.*ptr_f)() << '\n';
}
// ------------------------------------
新版明解C++中級編 p.133 演習3-13
次のプログラムは、ユーザが年/月/日の中から選んだ値を当てさせる日付当てゲームである。
年/月/日のすべてを、この順で当てさせるようにしたプログラムを作成せよ。なお、すべての値が当たるまでは、プログラムは終了しないものとする。
// ------------------------------------
// SimpleDate.h ヘッダファイル
#ifndef ___Class_SimpleDate
#define ___Class_SimpleDate
class SimpleDate {
int y; // 西暦年
int m; // 月
int d; // 日
public:
SimpleDate(int yy = 1, int mm = 1, int dd = 1)
: y(yy), m(mm), d(dd) { }
int year() const { return y; }
int month() const { return m; }
int day() const { return d; }
int comp_y(int yy) const { return yy - y; }
// yyから年を減じた値を返却
int comp_m(int mm) const { return mm - m; }
// mmから月を減じた値を返却
int comp_d(int dd) const { return dd - d; }
// ddから日を減じた値を返却
};
#endif
// ------------
// SimpleDateTest.cpp ファイル
#include <iostream>
#include "SimpleDate.h"
using namespace std;
int main() {
typedef int (SimpleDate::*Comp)(int) const;
Comp pcomp[] = {
&SimpleDate::comp_y,
&SimpleDate::comp_m,
&SimpleDate::comp_d,
};
int menu;
const SimpleDate birthday(1963, 11, 18);
cout << "私の誕生日を当ててください。\n";
do {
cout << "0…年/1…月/2…日/3…終了:"; cin >> menu;
if (menu >= 0 && menu <= 2) {
int value;
cout << "いくつかな:"; cin >> value;
int diff = (birthday.*pcomp[menu])(value);
if (!diff)
cout << "正解です。\n";
else if (diff > 0)
cout << diff << "だけ大きいです。\n";
else
cout << -diff << "だけ小さいです。\n";
}
} while (menu != 3);
}
// ------------------------------------
下のプログラムが解答です。なお、ヘッダファイル SimpleDate.h は問題で指定された上記のプログラムと同じなので、SimpleDateTest.cppファイルのコードだけを下記します。
// p133_演習3-13
// 問題で指定された仕様に変更した SimpleDateTest.cppプログラム
#include <iostream>
#include "SimpleDate.h"
using namespace std;
int main() {
typedef int (SimpleDate::*Comp)(int) const;
Comp pcomp[] = {
&SimpleDate::comp_y,
&SimpleDate::comp_m,
&SimpleDate::comp_d,
};
const char* menu[] = { "年", "月", "日" };
const SimpleDate birthday(1963, 11, 18);
cout << "私の誕生日を当ててください。\n";
for (int i = 0; i < 3; i++) {
int value;
do {
cout << "◆ " << menu[i] << " を入力 : "; cin >> value;
int diff = (birthday.*pcomp[i])(value);
if (!diff) {
cout << "正解です。\n";
break;
}
else if (diff > 0)
cout << diff << "だけ大きいです。\n";
else
cout << -diff << "だけ小さいです。\n";
} while (1);
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7063467
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック