C++ 反射機制的簡單實現


C++並不支持反射機制,只能自己實現。

如果需要實現字字符串到函數到映射,一定要使用到函數指針

簡單實現反射機制,根據字符串來構造相應到類。主要有以下幾點:

(1) 可以使用map保存字符從到函數指針到映射。

(2) 工廠類提供字符串與函數指針到注冊關系。

(3) 工廠模式根據不同到字符串構造不同到類對象。

 

代碼示例:

class_factory.h

 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.h

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM