C++並不支持反射機制,只能本身實現。html
若是須要實現字字符串到函數到映射,必定要使用到函數指針。ios
簡單實現反射機制,根據字符串來構造相應到類。主要有如下幾點:函數
(1) 能夠使用map保存字符從到函數指針到映射。post
(2) 工廠類提供字符串與函數指針到註冊關係。url
(3) 工廠模式根據不一樣到字符串構造不一樣到類對象。spa
代碼示例:指針
class_factory.hcode
1 #ifndef __CLASSFACTORY_ 2 #define __CLASSFACTORY_ 3 4 #include <iostream> 5 #include<string> 6 #include<map> 7 8 //定義函數指針 9 typedef void* (*create_fun)(); 10 11 class ClassFactory{ 12 public: 13 ~ClassFactory() {}; 14 15 //根據類註冊時的名字, 建立類實例, 並返回 16 void* getClassByName(std::string name){ 17 std::map<std::string, create_fun>::iterator it = my_map.find(name); 18 if (it == my_map.end()) { return NULL; } 19 20 create_fun fun = it->second; 21 if (!fun) { return NULL; } 22 23 return fun(); 24 } 25 26 //註冊類名稱與指針函數到映射關係 27 void registClass(std::string name, create_fun fun){ 28 my_map[name] = fun; 29 } 30 31 //單例模式 32 static ClassFactory& getInstance(){ 33 static ClassFactory fac; 34 return fac; 35 } 36 37 private: 38 ClassFactory() {}; //私有 39 std::map<std::string, create_fun> my_map; 40 }; 41 42 #endif
test.hhtm
1 #ifndef __TEST_H 2 #define __TEST_H 3 4 #include <iostream> 5 6 class Test{ 7 public: 8 Test(){ std::cout << "call Test Constructor fun" << std::endl; } 9 ~Test(){ std::cout << "call Test Destructor fun" << std::endl; } 10 void print(){ std::cout << "call Test print fun" << std::endl; } 11 }; 12 13 void* create_Test(){ 14 Test *t = new Test; 15 return (t == NULL)? NULL:t; 16 } 17 18 #endif
main.cpp對象
1 #include "test.h" 2 #include "class_factory.h" 3 4 int main(){ 5 //註冊 6 ClassFactory::getInstance().registClass("Test", create_Test); 7 8 //獲取類對象 9 Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test"); 10 if (!t){ 11 std::cout << "get instnce Test err;" << std::endl; 12 return 1; 13 } 14 15 t->print(); 16 delete t; 17 return 0; 18 }