C++ 反射机制的简单实现

简介: C++并不支持反射机制,只能自己实现。如果需要实现字字符串到函数到映射,一定要使用到函数指针。简单实现反射机制,根据字符串来构造相应到类。主要有以下几点:(1) 可以使用map保存字符从到函数指针到映射。

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 }

 

相关文章
|
7月前
|
设计模式 算法 测试技术
C++ 创建兼容多个IPC机制的上层接口
C++ 创建兼容多个IPC机制的上层接口
130 1
|
7月前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
214 0
|
7月前
|
安全 算法 C++
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(三)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
148 0
|
1月前
|
存储 安全 编译器
【c++】深入理解别名机制--引用
本文介绍了C++中的引用概念及其定义、特性、实用性和与指针的区别。引用是C++中的一种别名机制,通过引用可以实现类似于指针的功能,但更安全、简洁。文章详细解释了引用的定义方式、引用传参和返回值的应用场景,以及常引用的使用方法。最后,对比了引用和指针的异同,强调了引用在编程中的重要性和优势。
36 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
65 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
67 7
|
7月前
|
安全 C++
C++中的异常处理与错误处理机制
C++中的异常处理与错误处理机制
81 0
|
7月前
|
存储 C++
C++ 栈和堆的作用机制,及特点区别
在介绍C++中的十分重要的动态内存管理机制之前,有必要先单独来介绍一下C++中的两个概念,分别是栈和堆。
72 2
|
7月前
|
存储 编译器 C++
从Proto到C++:探索Protocol Buffers的强大转换机制
从Proto到C++:探索Protocol Buffers的强大转换机制
757 4
|
7月前
|
Linux 程序员 C++
【C++ 常见的异步机制】探索现代异步编程:从 ASIO 到协程的底层机制解析
【C++ 常见的异步机制】探索现代异步编程:从 ASIO 到协程的底层机制解析
1073 2