🧭 ドラクエ風「商人クラス」で学ぶ getter / setter / public / private

クラスの中のデータを 関数を通して安全に扱う 方法を学ぶ

gettersetter の役割を理解する

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 は「内部で守るため」

値の範囲チェックを忘れずに入れる

  • game-engineer/classes/2025/game-development-1/no-010.txt
  • 最終更新: 3カ月前
  • by root