単純フレーム
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 }