c++通过类名动态创建对象
转载:http://www.seacha.com/article.php/knowledge/cbase/2013/0615/2154.html
主要思想:在每次创建类的过程中,通过各自类的辅助类(所以每个类必须包含IMPLEMENT_DYNCRT_BASE)向基类通过“注册函数'注册,然后通过重载“工厂函数”,在创建类时,自身创建类。这里函数指针的使用非常重要。
#include <map>
#include <string> #define DECLEAR_DYNCRT_BASE(CBase) \
public: \
typedef CBase *(*ClassGen)(); /* 声明函数指针*/ \
static CBase *Create(const string &class_name) /* 工厂函数 */ \
{ \
std::map<string, ClassGen>::iterator iter = m_class_set.find(class_name); \
if (m_class_set.end() != iter) \
{ \
return ((*iter).second)(); \
} \
return NULL; \
} \
protected: \
static void Register(const string &class_name, ClassGen class_gen) /* 注册函数 */ \
{ \
m_class_set.insert(map<string, ClassGen>::value_type(class_name, class_gen)); \
} \
static std::map<string, ClassGen> m_class_set /* 存储子类信息 */ // 用于实现基类
#define IMPLEMENT_DYNCRT_BASE(CBase) \
std::map<string, CBase::ClassGen> CBase::m_class_set #define DECLEAR_DYNCRT_CLASS(CDerived, CBase) \
public: \
struct CDerived##Register /* 辅助类,用于注册 */ \
{ \
CDerived##Register() \
{ \
static bool bRegistered = false; /* 注册子类,只注册一次 */ \
if(!bRegistered) \
{ \
CBase::Register(#CDerived, CDerived::Create); /* 注册子类信息 */ \
bRegistered = true; \
} \
} \
}; \
static CBase *Create() /* 工厂函数 */ \
{ \
return new CDerived; \
} \
static struct CDerived##Register m_t##CDerived##Register // 用于实现一个能被动态创建的类
#define IMPLEMENT_DYNCRT_CLASS(CDerived) \
static CDerived::CDerived##Register m_t##CDerived##Register class CBase
{
DECLEAR_DYNCRT_BASE(CBase);
DECLEAR_DYNCRT_CLASS(CBase, CBase);
public:
virtual void Print()
{
std::cout << "This is base!" << std::endl;
}
}; IMPLEMENT_DYNCRT_BASE(CBase);
IMPLEMENT_DYNCRT_CLASS(CBase); class TEST: public CBase
{
DECLEAR_DYNCRT_CLASS(TEST, CBase);
public:
virtual void Print()
{
cout << "This is test!" << endl;
}
};
IMPLEMENT_DYNCRT_CLASS(TEST); int main()
{
CBase* base = CBase::Create("TEST");
if (base)
{
base->Print();
} return ;
}
c++通过类名动态创建对象的更多相关文章
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
[C++学习笔记14]动态创建对象 C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...
- swift如何动态创建对象
前言: 在一些大型的项目中常常在加载页面的时候根据服务器请求下来的数据动态创建视图控制器对象,最近的一个项目就有这一方面的需求,加载页面之前需要先请求服务器的数据得到一个JSON字典,根据里面字符串的 ...
- MFC中关于运行时类信息及动态创建对象的两个宏的意义(转)
http://blog.csdn.net/ligand/article/details/49839507 MFC运行时类信息 用途: 程序在运行时,获取对象类的信息及类的继承关系 实现: 1.定义的类 ...
- C# 利用反射动态创建对象[摘录]
摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...
- protobuf在java应用中通过反射动态创建对象(DynamicMessage)
---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(...),这样就要求服务器在接 ...
- 【转】C# 利用反射动态创建对象
http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...
- Day14_80_反射机制+IO+Propreties动态创建对象
反射机制+IO+Propreties动态创建对象 * 使用Properties文件,在文件中通过<key value>的形式保存一下类名,然后通过IO 获取该类名,再然后利用反射机制得到该 ...
- C# 中反射获取某类的子类和根据类型名动态创建对象
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...
- C#主要支持 5 种动态创建对象的方式
C#主要支持 5 种动态创建对象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) ...
随机推荐
- C#中的访问修饰符
1. 简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问.protected : 保护成员,该类内部 ...
- OOP几大原则【转】
设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前 ...
- Java开发中的23种设计模式详解 【转】
创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问 ...
- CMD/AMD的原理、区别和应用
有必要简单提一下两者的主要区别: 1.CMD推崇依赖就近,可以把依赖写进你的代码中的任意一行,例: define(function(require, exports, module) { var a ...
- Windows下搭建基于SSH的Git服务器
Git客户端安装 客户端要同时安装在远程服务器和自己的电脑上,下载地址:http://msysgit.github.io/ 选择安装组件 :也可以默认选择; 图标组件(Addition icons) ...
- k8s debug记录之kubelet user.slice container monitor failure
在kubernetes中,如果使用其自带的单机启动脚本./hack/local-up-cluster.sh来启动一个本地集群的话,会在kubelet的日志中观察到类似以下内容的日志: Failed t ...
- python之MySQL学习——防止SQL注入
python之MySQL学习——防止SQL注入 学习了:https://www.cnblogs.com/xiaomingzaixian/p/7126840.html https://www.cnblo ...
- Windows如何使用主题包
相信有很多朋友都遇到这样的问题 下载了主题却没有办法安装就是解压到C:\WINDOWS\Resources\Themes也是于事无补 没有任何反应 回到桌面 点击右键还是没有没有任何反应见图一 原因很 ...
- POJO百度百科
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJB混淆起来, ...
- Tabs or Spaces?
Never mix tabs and spaces. The most popular way of indenting Python is with spaces only. The second- ...