根据标记动态创建相关类并调用函数

2019-04-15 13:48发布

#include class pic { public: typedef pic *(*children)(); static pic *create(const int classId) { std::map::iterator it = _myChildren.find(classId); return (it == _myChildren.end()) ? NULL : (it->second)(); } protected: static void _register(const int classId,children classDerived) { _myChildren.insert(std::map::value_type(classId,classDerived)); } private: static std::map _myChildren; public: virtual void load() = 0; }; std::map pic::_myChildren; //两个关键的宏定义 //声明 #define DECLEAR_DYNCRT_PICCLASS(derived,classId) public: struct derived##register { derived##register() { static bool bRegister = false; if (!bRegister) { pic::_register(classId,_createObject); bRegister = true; } } }; static pic* _createObject() { return new derived; } //实现 #define IMPLEMENT_DYNCRT_PICCLASS(derived) static derived::derived##register _##derived##object; #include using namespace std; class pic1 :public pic { DECLEAR_DYNCRT_PICCLASS(pic1,1) //声明动态类 public: virtual void load() { cout << "pic1 load" << endl; iPic1 = 11; } int iPic1; }; IMPLEMENT_DYNCRT_PICCLASS(pic1) //实现 class pic2 :public pic { DECLEAR_DYNCRT_PICCLASS(pic2,2) //声明动态类 public: virtual void load() { cout << "pic2 load" << endl; } }; IMPLEMENT_DYNCRT_PICCLASS(pic2) //实现 class pic3 :public pic { DECLEAR_DYNCRT_PICCLASS(pic3,3) //声明动态类 public: virtual void load() { cout << "pic3 load" << endl; } }; IMPLEMENT_DYNCRT_PICCLASS(pic3) //实现 int main() { pic *p1 = pic::create(1); p1->load(); pic *p2 = pic::create(2); p2->load(); pic *p3 = pic::create(3); p3->load(); return 0; }