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

広告

posted by fanblog

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';
}
// ------------------------------------

f03_0038.png


新版明解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);
}
}

f03_13.png


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

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

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

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





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7063467
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

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

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

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

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

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


検索
<< 2018年08月 >>
      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日以上新しい記事の更新がないブログに表示されております。