[ create a new paste ] login | about

Link: http://codepad.org/AG21ETE1    [ raw code | output | fork ]

C++, pasted on Dec 28:
#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;
}


Output:
1
2
魔法使いです!!
俺が勇者だ!!


Create a new paste based on this one


Comments: