アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2017年12月06日

《その164》 メンバ関数へのポインタ 


 クラスのメンバ関数へのポインタ

 クラスのメンバ関数を、直接呼び出すのではなく、目的の関数へのポインタを通じて動的に呼び出すことを考えます。
次のプログラムは、記念日が何年年月何日であるかを当てさせる単純なものですが、コード中にコメントとして、メンバ関数へのポインタの記述方法やそれに関連したことを書き込みました。


// ------------------------------------
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;

class Anniversary {
// 記念日クラス Anniversary は
// 日付( 1980/01/01 〜 2017/12/31 )を1つだけ保持します。

int y, m, d;
public:
Anniversary() {
srand((unsigned)time(NULL));
y = rand() % 38 + 1980; // 1980 〜 2017
m = rand() % 12 + 1; // 1 〜 12
switch (m) {
case 2: d = rand() % 28 + 1 + (
y % 4 == 0 && y % 100 != 0 ||
y % 400 == 0); // うるう年を考慮
break;
case 4:
case 6:
case 9:
case 11: d = rand() % 30 + 1; break;
default: d = rand() % 31 + 1; break;
}
}
int yy() const { return y; }
int mm() const { return m; }
int dd() const { return d; }
};

int main() {
Anniversary date;
// Anniversaryクラスの dateオブジェクトを作成。
// 日付を1つ保持しています。


cout << "記念日( 1980/01/01 〜 2017/12/31 )を当ててください。\n";

typedef int (Anniversary::*Anniv)() const;
// Anniversaryクラスのメンバ関数 yy, mm, dd は、仮引数無し、
// 返却値 int ですから、これらのメンバ関数
// へのポインタ型は、次のようになります。
// int (Anniversary::*pointer)()
// このメンバ関数へのポインタ型に typedef名 Anniv を与える
//         には、const関数でもあることを考慮して、
// typedef int (Anniversary::*Anniv)() const; と記述します。


Anniv ymd[] = {
&Anniversary::yy,
&Anniversary::mm,
&Anniversary::dd
};
// 配列 ymd は、Anniv型を要素型とする配列で、その要素数は
// 3 です。
// ymd[0] は Anniversary::yy を指し、
// ymd[1] は Anniversary::mm を指し、
// ymd[2] は Anniversary::dd を指すことになります。


int menu; // 配列 ymd の添字(要素番号 0 〜 2)です。
// 配列 answer の添字でもあります。
int val; // 入力された値を受け取るための変数です。
int answer[3] = { 0 }; // 年が正解したら answer[0] = 1
// 月が正解したら answer[1] = 1
// 日が正解したら answer[2] = 1
do {
do {
cout << "年(0) 月(1) 日(2) のどれを入力しますか : "; cin >> menu;
} while (menu < 0 || menu > 2);

cout << "値を入力 : "; cin >> val;

if (val == (date.*ymd[menu])()) {
// date.*ymd[menu] は、
// (date.*ymd[0])() のときは、date.yy() のこと
// (date.*ymd[1])() のときは、date.mm() のこと
// (date.*ymd[2])() のときは、date.dd() のことになります。


cout << "正解です。\n";
answer[menu] = 1;
}
else {
cout << (date.*ymd[menu])() - val << " を加えてください。\n";
answer[menu] = 0;
}
} while (answer[0] == 0 || answer[1] == 0 || answer[2] == 0);

cout << date.yy() << "年" << date.mm() << "月" << date.dd() << "日\n";
}
// ------------------------------------

f03_0036.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)






 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2017年12月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。