#include <iostream>
#include <cstdlib>
class unit
{
public:
virtual ~unit() { }
virtual void say() = 0;
};
// 勇者クラス
class yusya: public unit {
public:
// 生成関数
static unit* create() { return new yusya(); }
virtual void say() { std::cout << "俺が勇者だ!!" << std::endl; }
private:
/* コンストラクタは通常隠蔽して、create()だけを通して生成できるようにする。*/
yusya() { }
};
// 魔法使いクラス
class mahou : public unit {
public:
static unit* create() { return new mahou(); }
virtual void say() { std::cout << "魔法使いです!!" << std::endl; }
private:
mahou() { }
};
enum e_kind
{
KIND_YUSYA,
KIND_MAHOU,
KIND_SIZE
};
typedef unit* (*unit_creator)();
// 各クラスのオブジェクト生成関数を配列に入れる
unit_creator creators[KIND_SIZE] = {
yusya::create,
mahou::create,
};
unit* loadPlayerSetting()
{
// 例えばセーブデータからロードしてプレイヤーユニットを作るとして、
e_kind player_unit_kind = e_kind( std::rand() % 2 );
unit* player = creators[player_unit_kind](); //お呼び出し
return player;
}
int main()
{
unit* player1 = loadPlayerSetting();
unit* player2 = loadPlayerSetting();
// 喋れ!
player1->say();
player2->say();
delete player1;
delete player2;
return 0;
}