简单框架
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) 收藏 举报
浙公网安备 33010602011771号