codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#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; }
Private
[
?
]
Run code
Submit