C/C++ --- 动态注册类
来源:互联网 发布:梦想小镇mac同步ios 编辑:程序博客网 时间:2024/06/06 18:25
背景
需要根据配置文件中的插件名字获取插件实例,从而需要维护<插件名字,插件实例>的映射关系。
当有新插件加入项目时,每次都需要在该映射关系中插入一条信息。为了避免避免此操作,通过定义宏
自动完成 新插件的注册功能。
设计思想
每个插件在全局域中定义一个注册类,在该注册类的构造函数中将<插件名字,插件实例>插入全局的map中,
在全局域定义该注册类的一个实例,从而调用构造函数,在map中插入该插件的名字和实例。
代码
(1)插件基类: class BasePlugin{ public: virtual bool Run()=0;};(2)映射关系--全局域函数这里采用函数,而不是直接在全局域定义静态变量是为了解决全局变量相互依赖的问题,(如全局对象A依赖于全局对象B,而B晚于A被构造出来)。std::map<std::string,BasePlugin*>& GetPlugin(){ //局部静态对象,只有在使用到时才会被构造出来,由于是在全局对象构造中被调用到,所以不存在多线程问题, //因为这发生在main函数之前,其它线程还没有创建出来 static std::map<std::string,BasePlugin*> mapPlugin; return mapPlugin;}(3)注册类当构造该类的对象时,插入<name,BasePlugin*>到mapPlugin中,自动完成注册register.h#define REGISTER_PLUGIN(name) \ class name##Register \ { \ public: \ name##Register() \ { \ GetPlugin().insert(std::make_pair(#name, new (std::nothrow) name)); \ } \ }; \ name##Register name##reg; //调用构造函数(4)具体插件类1)myplugin.hclass MyPlugin{ MyPlugin() {}; ~MyPlugin(){}; bool Run();};2)myplugin.cpp(必须在cpp中调用上面定义的宏,原因待解)#include "register.h"#include <map>//<"MyPlugin", new MyPlugin>被插入到mapPlugin中REGISTER_PLUGIN(MyPlugin);bool MyPlugin::Run(){ ....}
0 0
- C/C++ --- 动态注册类
- C语言实现注册
- 【c++】注册OCX控件
- 【C++】注册热键-RegisterHotKey
- C#—软件注册与注册机
- JavaSE JNI 动态注册本地方法(c语言实现native层)
- C/C++注册动态对象到Lu系统并进行运算符重载
- JavaSE JNI 动态注册本地方法(c语言实现native层)
- JavaSE JNI 动态注册本地方法(c语言实现native层)
- Android Studio JNI 的静动态注册开发以及C/C++ JNIEnv的理解
- C#如何读取注册信息
- C#如何读取注册信息
- OCX 控件注册 C+/VC
- C#/winform 腾讯QQ注册
- lua c函数注册器
- 【C++】注册与回调
- C语言注册登录系统
- C语言函数注册,回调
- 关于图片压缩上传问题;
- css3-animation实践1 两个元素的翻转与切换
- java菱形
- 顶部图片循环播放开源库Android-ConvenientBanner的使用。。。
- iOS 录音和视频录制播放
- C/C++ --- 动态注册类
- android studio ndk undefined reference to '
- JAVA环境搭建
- springmvc mybatis 基于全注解事务配置注意事项
- 极光推送简单应用设置
- tjut 3555
- mysql查询时传入中文时的乱码问题
- TCP/IP中32位IP地址与字符串转化
- hadoop、zookeeper、hbase、spark集群环境搭建