c++反射概念-簡單介紹

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

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 }
複製代碼
相關文章
相關標籤/搜索