クラスの中のデータを 関数を通して安全に扱う 方法を学ぶ
getter と setter の役割を理解する
public / private を使って データを守る(カプセル化) しくみを体験する
次のプログラムを実行してみよう。
#include <iostream> #include <string> 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 <iostream> #include <string> 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 は「内部で守るため」
値の範囲チェックを忘れずに入れる