ドラクエ風「商人クラス」で学ぶ getter / setter / public / private
🎮 授業進行カンペ:ドラクエ風「商人クラス」で学ぶ getter / setter / public / private
🧭 授業概要
-
対象:専門学校1年(C++基礎後半)
-
前提:クラス・メンバ関数の基本を理解している
-
目的:getter/setterを使ったデータ保護と、public/privateの導入
⏱ 授業構成(45分想定)
| 時間 | 内容 | 教員アクション |
|---|---|---|
| 0〜5分 | 導入(勇者が商人に話しかける小芝居) | 「勇者が在庫を勝手に増やしたらどうなる?」で笑いを取る |
| 5〜15分 | バグる商人コードを実行 | あえて m.stock=9999; m.price=-100; を見せて「チート商人」を演出 |
| 15〜25分 | getter/setter導入 | 「値をチェックしてから代入する」関数の必要性を強調 |
| 25〜35分 | public/private導入 | 「商人の金庫は鍵付き!」の比喩で説明 |
| 35〜45分 | 実装演習+発表 | 各自のコンソール出力を見せ合う(勇者バグネタを拾う) |
💬 導入トーク例
「今日はドラクエの“商人”を作ります。やくそうを8Gで売る設定です。」
「ところがこの商人、外から勝手に在庫を増やせるバグがあります!」
「勇者がm.stock = 9999;って打ったら、どうなると思う?」
→ 学生「無限やくそう!」「最強チートじゃん!」
→ 教員「そう、だから商人の金庫に鍵をかけましょう」
→ ⇒ private へつなげる。
🧩 実演ポイント
1️⃣ バグる商人
-
実行して「マイナス価格」「無限在庫」を見せる。
-
学生の笑いを誘いながら、“危険な状態”を目で見せる。
2️⃣ 安全な商人(getter/setter+private)
-
SetPrice()に範囲チェックを追加。 -
private:を書いた瞬間に「外から触れない」ことを実演。 -
「勇者が金庫を開けようとして怒られる!」と演出。
🧠 板書例(黒板・スライド)
public : みんなが見えるところ(入口)
private: 秘密の金庫(中身)
---------------------------
getter : 値を読む関数
setter : 値を入れる関数(チェック付き)
💬 教員のコメント例
-
「public は “お店のカウンター”、private は “裏の倉庫”」
-
「倉庫に勝手に入る勇者は万引き犯!」
-
「getter/setter は “店員を通して取引する”」
🎯 チェックポイント
-
getter/setterの命名ルール:
Get○○()/Set○○() -
値チェックは setter にまとめる
-
private変数はクラス外からアクセス不可 -
直接代入の禁止を実演して実感させる
🧩 練習問題指導メモ
-
Q1〜Q3:個人で実装させる(10分)
-
Q4:実行出力をペアで見せ合う
-
Q5(発展):2回目授業の導入へ(Playerクラスとの取引)
🧩 よくある質問と返し方
| 質問 | 回答例 |
|---|---|
| 「なんで全部publicでよくないんですか?」 | 「家の金庫を玄関に置かないのと同じ。守るものは隠す!」 |
| 「priceをマイナスにしても別に動くけど?」 | 「コンピュータは素直。だから人間がルールを教える。」 |
| 「getter/setterだとコード長くない?」 | 「安全のためのコスト。後でバグ直すより安い!」 |
🪜 次回へのつなぎ方
-
「商人が商品(Item)を複数持つ」→ vectorへ
-
「プレイヤーと取引」→ has-a 関係へ
-
「商品タイプ」→ enum classへ
-
constメンバ関数導入タイミング:次回「情報を読むだけの関数とは?」で扱う
🎬 締めの一言案
「プログラムもお店も、“誰でも触れる場所”と“触れちゃダメな場所”があるんです。
今日のゴールは、“商人の金庫に鍵をかけられるようになった” こと!」