====== 🧭 ドラクエ風「商人クラス」で学ぶ 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'' は「内部で守るため」
値の範囲チェックを忘れずに入れる