keep_simple

导航

简单框架

  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 }

 

posted on 2012-12-24 15:08  keep_simple  阅读(288)  评论(0)    收藏  举报