C++实现反射
1.前言
?反射:通過類的名字得到該類的實例對象
2. 思路
?1.?在需要反射的類中定義一個創建該類對象的回調函數(靜態成員函數,這樣不需創建出類對象即可調用)
?2.?設計一個工廠類,類中有一個map,用于保存類名和創建類實例的回調函數,該工廠類提供注冊反射類和創建類實例的接口
?3.?初始化時,將需要反射類的名字和回調函數存入map里,類名字做為map的key值;回調函數作為map的value值
?4.?傳入類的名字,調用工廠類的創建函數,得到需要的類實例指針
3. 實現
1. 步驟1中示例類的代碼
CTest.h
CTest.cpp
#include "CTest.h"CTest::CTest() {cout<<"call CTest Constructor fun"<<endl; }CTest::~CTest() { cout<<"call CTest Destructor fun"<<endl; }void CTest::print() { cout<<"call CTest print fun"<<endl; }void* CTest::create_Test() {CTest* PTest = new CTest();return PTest; }2. 步驟2中工廠類的代碼
CClassFactory.h
#ifndef __CCLASSFACTORY_ #define __CCLASSFACTORY_#include <iostream> #include <map> #include <string>using namespace std;// 創建類實例的函數指針 typedef void* (*create_fun)();// 工廠類,提供注冊反射類和創建類實例的接口 class CClassFactory { public:~CClassFactory();// 根據類名字創建類實例void* CreateClassEntity(string name);//注冊類名稱與指針函數到映射關系void RegistClass(string name, create_fun fun); // 獲取工廠,單例模式static CClassFactory& GetInstance(); private:// 構造函數必須私有化,外部只可調用getInstance()來獲取工廠對象CClassFactory();// key:類名,value:創建該類的回調函數map<string, create_fun> m_map; }; #endifCClassFactory.cpp
#include"CClassFactory.h"CClassFactory::CClassFactory() { }CClassFactory::~CClassFactory() { }void* CClassFactory::CreateClassEntity(string name) {map<string, create_fun>::iterator iter = m_map.find(name);if (iter == m_map.end()) { return NULL; }create_fun fun = iter->second;if (fun == NULL) { return NULL; }return fun(); } void CClassFactory::RegistClass(string name, create_fun fun) {m_map[name] = fun; } CClassFactory& CClassFactory::GetInstance() {// 通過靜態變量來實現單例模式,這樣只有在調用本函數時才會進行工廠的初始化static CClassFactory fac;return fac; }3. 步驟3中的初始化代碼和步驟4中的調用代碼
main.cpp
#include "CTest.h" #include "CClassFactory.h"int main() {// 先注冊CClassFactory::GetInstance().RegistClass("CTest", CTest::create_Test); // 根據名字創建出類對象CTest* PTest = (CTest*)CClassFactory::GetInstance().CreateClassEntity("CTest");if (PTest == NULL){cout<<"create CTest entity failed"<<endl;return -1;} // 調用類對象的函數PTest->print();delete PTest;return 0; } 4. 實驗結果總結
- 上一篇: luabind-0.9.1在window
- 下一篇: C++四种强制类型转换 dynamic_