#define DECLARE_CLASS_CREATE(class_name) \ static CObject* CreateClass## class_name (); #define IMPL_CLASS_CREATE(class_name) \ static CObject* CreateClass## class_name (){ \ return new class_name; \ }; #define REG_CLASS_CREATE(class_name) \ RegisterFactoryCreate(class_name::CreateClass## class_name, #class_name);
-
C++并不支持反射机制,只能自己实现。
如果需要实现字字符串到函数到映射,一定要使用到函数指针。
简单实现反射机制,根据字符串来构造相应到类。主要有以下几点:
(1) 可以使用map保存字符从到函数指针到映射。
(2) 工厂类提供字符串与函数指针到注册关系。
(3) 工厂模式根据不同到字符串构造不同到类对象。
-
#ifndef __CLASSFACTORY_ #define __CLASSFACTORY_ #include <iostream> #include<string> #include<map> //定义函数指针 typedef void* (*create_fun)(); class ClassFactory{ public: ~ClassFactory() {}; //根据类注册时的名字, 创建类实例, 并返回 void* getClassByName(std::string name){ std::map<std::string, create_fun>::iterator it = my_map.find(name); if (it == my_map.end()) { return NULL; } create_fun fun = it->second; if (!fun) { return NULL; } return fun(); } //注册类名称与指针函数到映射关系 void registClass(std::string name, create_fun fun){ my_map[name] = fun; } //单例模式 static ClassFactory& getInstance(){ static ClassFactory fac; return fac; } private: ClassFactory() {}; //私有 std::map<std::string, create_fun> my_map; }; #endif #ifndef __TEST_H #define __TEST_H #include <iostream> class Test{ public: Test(){ std::cout << "call Test Constructor fun" << std::endl; } ~Test(){ std::cout << "call Test Destructor fun" << std::endl; } void print(){ std::cout << "call Test print fun" << std::endl; } }; void* create_Test(){ Test *t = new Test; return (t == NULL)? NULL:t; } #endif #include "test.h" #include "class_factory.h" int main(){ //注册 ClassFactory::getInstance().registClass("Test", create_Test); //获取类对象 Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test"); if (!t){ std::cout << "get instnce Test err;" << std::endl; return 1; } t->print(); delete t; return 0; }
C++实现反射机制
最新推荐文章于 2024-09-04 23:23:57 发布