之前碰到过一个问题,C++中如何通过一个字符串生成一个类。

C++是不支持通过类名称字符串”ClassXX”来生成对象的,也就是说我们可以使用 new ClassXX 来生成对象,但是不能通过 new "ClassXX"; 来生成对象。

我们就可以通过反射来解决这个问题,但是C++本身不支持反射,却可以让我们自己实现。

设计思路:

(1)如果需要实现字字符串到函数到映射,一定要使用到函数指针

(2)可以使用map保存字符从到函数指针到映射。

(3)工厂类提供字符串与函数指针到注册关系。

(4)程序开始运行时,将回调函数存入std::map(哈希表)里面,类名字做为map的key值。

代码如下:

class_factory.h

#ifndef __CLASSFACTORY_
#define __CLASSFACTORY_ #include <iostream>
#include<string>
#include<map> //定义函数指针
typedef void* (*create_fun)(); class ClassFactory{
public:
~ClassFactory() {}; //根据类注册时的名字, 创建类实例, 并返回
void* getClassByName(std::string name){
std::map<std::string, create_fun>::iterator it = my_map.find(name);
if (it == my_map.end()) { return NULL; } create_fun fun = it->second;
if (!fun) { return NULL; } return fun();
} //注册类名称与指针函数到映射关系
void registClass(std::string name, create_fun fun){
my_map[name] = fun;
} //单例模式
static ClassFactory& getInstance(){
static ClassFactory fac;
return fac;
} private:
ClassFactory() {}; //私有
std::map<std::string, create_fun> my_map;
}; #endif

  test.h

#ifndef __TEST_H
#define __TEST_H #include <iostream> class Test{
public:
Test(){ std::cout << "call Test Constructor fun" << std::endl; }
~Test(){ std::cout << "call Test Destructor fun" << std::endl; }
void print(){ std::cout << "call Test print fun" << std::endl; }
}; void* create_Test(){
Test *t = new Test;
return (t == NULL)? NULL:t;
} #endif

main.cpp

#include "test.h"#include "ClassFactory.h"

int main(){
//注册
ClassFactory::getInstance().registClass("Test", create_Test); //获取类对象
Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test");
if (!t){
std::cout << "get instnce Test err;" << std::endl;
return ;
} t->print();
delete t;
return ;
}

部分引用:https://www.cnblogs.com/xudong-bupt/p/6643721.html

最新文章

  1. Photoshop将普通照片快速制作二次元漫画风格效果
  2. SpringMVC文件上传下载
  3. 创建Maven工程
  4. Unix/Linux 命令技巧
  5. 一小时学会Markdown写作
  6. 解决div里插入img下边缝隙问题
  7. 第一篇代码 嗨翻C语言 21点扑克
  8. iOS-CoreImage简单使用
  9. 软件开发中的单一职责(转至INFOQ)
  10. Windows 8.1 正式版 MSDN第二版 官方简体中文/英文版 (专业版/企业版)
  11. OC-多线程安全隐患及一般解决办法
  12. JS 之设置元素样式的改变,可以利用样式框架
  13. java 重写的学习
  14. SQL三类语句
  15. FastJson用法
  16. Luogu 1641[SCOI2010]生成字符串 - 卡特兰数
  17. C++ Websites
  18. oracle中的序列,可以解决自增各种编号自动增长问题,说一下我的小问题。
  19. VirtualBox network / study environment setup for RHEL
  20. javascript总结系列49:javaScript教程:原型链不可变

热门文章

  1. Storm 学习之路(六)—— Storm项目三种打包方式对比分析
  2. Spring事物管理简介 (转)
  3. TCP11种状态集之TIME_WAIT
  4. java集合框架中的去重问题
  5. Codeforces Gym101205D:Fibonacci Words(KMP+递推)
  6. RedisCrawlSpider
  7. Oracle数据库---触发器
  8. 《转载黑马教程》HTML&amp;&amp;CSS讲义0,,包含教程_仅供参考
  9. c# Inner Join sql 和 Enumerable.Join
  10. SpringBoot之SpringApplication Explain