単純フレーム

12528 ワード

  1 #include <iostream>

  2 #include <vector>

  3 #include <algorithm>

  4 using namespace std;

  5 class Base

  6 {

  7 public:

  8 

  9     virtual void run()=0;

 10   

 11 };

 12 

 13 template<class T>

 14 class BaseT: public Base

 15 {

 16 public:

 17     static Base* get()

 18     {

 19         return new T;

 20     }

 21    

 22 };

 23 

 24 class A : public BaseT<A>

 25 {

 26 public:

 27     A()

 28     {

 29     }

 30     void run()

 31     {

 32         print();

 33     }

 34     void print()

 35     {

 36         cout<< "A" << endl;

 37     }

 38 };

 39 

 40 class B: public BaseT<B>

 41 {

 42 public:

 43     B()

 44     {

 45     }

 46     void run()

 47     {

 48         print();

 49     }

 50     void print()

 51     {

 52         cout<< "B" <<endl;

 53     }

 54 };

 55 

 56 typedef Base* (*Creat)();

 57 class BaseAgent

 58 {

 59 public:

 60     BaseAgent(Creat c):creat_(c),base_agent_(NULL)

 61     {

 62 

 63     }

 64     ~BaseAgent()

 65     {

 66         if(base_agent_ != NULL)

 67             delete base_agent_;

 68         base_agent_ = NULL;

 69             

 70     }

 71     void run()

 72     {

 73         if(base_agent_ == NULL)

 74             base_agent_ = creat_();

 75         base_agent_->run();

 76     }

 77 private:

 78     Creat creat_;

 79     Base * base_agent_;

 80 };

 81 

 82 struct Regster

 83 {

 84 public:

 85 typedef vector<BaseAgent> vecBA;

 86 

 87     Regster(Creat c)

 88     {

 89         BaseAgent ba(c);

 90         add_vba(ba);

 91     }

 92     ~Regster()

 93     {}

 94     static void add_vba(const BaseAgent & ba)

 95     {

 96         v_ba_.push_back(ba);

 97     }

 98     static vecBA& get_vba()

 99     {

100         return v_ba_;       

101     }

102 private:

103     static vecBA v_ba_;

104     

105 };

106 

107 Regster::vecBA Regster::v_ba_;

108 

109 Regster ra(A::get);

110 Regster rb(B::get);

111 

112 int main()

113 {

114     Regster::vecBA& vba = Regster::get_vba();

115     if(vba.size() == 0)

116         cout<< " zero " << endl;

117     for_each(vba.begin(),vba.end(),[](BaseAgent& ba)

118     {

119         ba.run();

120     });

121 }