====== 🧭 ドラクエ風「商人クラス」で学ぶ getter / setter / public / private ====== ===== 🎯 学習目標 ===== クラスの中のデータを ''関数を通して安全に扱う'' 方法を学ぶ ''getter'' と ''setter'' の役割を理解する ''public / private'' を使って ''データを守る(カプセル化)'' しくみを体験する ===== 💡 導入:バグる商人 ===== 次のプログラムを実行してみよう。 #include #include using namespace std; class Merchant { public: string itemName; int price; int stock; void Sell() { if (stock > 0) { stock--; cout << itemName << "を" << price << "Gで売った!" << endl; } else { cout << "在庫がない!" << endl; } } }; int main() { Merchant m; m.itemName = "やくそう"; m.price = 8; m.stock = 2; m.Sell(); m.Sell(); m.Sell(); // 在庫切れ m.stock = 9999; // ← 勝手に在庫復活! m.price = -100; // ← マイナス価格!? m.Sell(); } 出力例: やくそうを8Gで売った! やくそうを8Gで売った! 在庫がない! やくそうを-100Gで売った! → なにが問題? 外から勝手に値を変えられている ''マイナス金額'' や ''無限在庫'' など、ゲームとしておかしい状態になる ===== 🧱 改良:安全な商人 ===== 変数を守るために ''private'' にして、関数を通して値を設定・取得できるようにします。 (これが ''getter / setter'' の基本です) #include #include using namespace std; class Merchant { private: // 外部からは触らせない(秘密の金庫) string itemName; int price; int stock; public: // 外から呼び出してよい関数(カウンター) void SetItemName(string name) { itemName = name; } void SetPrice(int value) { if (value < 0) value = 0; // マイナス禁止 if (value > 9999) value = 9999; // 上限 price = value; } void SetStock(int value) { if (value < 0) value = 0; // 在庫マイナス禁止 stock = value; } string GetItemName() { return itemName; } int GetPrice() { return price; } int GetStock() { return stock; } void Sell() { if (stock > 0) { stock--; cout << itemName << "を" << price << "Gで売った!" << endl; } else { cout << "在庫がない!" << endl; } } }; int main() { Merchant m; m.SetItemName("やくそう"); m.SetPrice(8); m.SetStock(2); m.Sell(); m.Sell(); m.Sell(); // 在庫がない! // m.stock = 9999; ← エラー:もう外から触れない // m.price = -100; ← エラー:もう外から触れない } 出力例: やくそうを8Gで売った! やくそうを8Gで売った! 在庫がない! ===== 🔍 まとめ ===== ^ 用語 ^ 意味 ^ 例 ^ | public | 外からアクセスできる | SetPrice(), Sell() | | private | 外からアクセスできない | price, stock | | getter | 値を取り出す関数 | GetStock() | | setter | 値を設定する関数 | SetStock() | ''public'' … お店のカウンター(誰でも使う) ''private'' … 商人の金庫(中身を守る) ''getter/setter'' … 店員を通して取引する ===== 🧩 練習問題 ===== (1) 商人に「アイテム名」「価格」「在庫」を ''private'' で定義し、Set/Get 関数を作成せよ。 (2) SetPrice()で価格が0未満なら0に、9999より大きければ9999にするように修正せよ。 (3) SetStock()で在庫がマイナスなら0にせよ。 (4) main関数で商人を作り、「やくそう」を2個販売するプログラムを完成させよ。 (5) (発展)Player クラスを追加し、「プレイヤーがお金を払って買う」動作を考えてみよう。 ===== 🏁 チェックポイント ===== 外から直接変数をいじらない(m.stock = 9999; はエラー) 値の設定は ''setter関数'' で行う 値の取得は ''getter関数'' で行う ''public'' は「外部から使うため」、''private'' は「内部で守るため」 値の範囲チェックを忘れずに入れる