C++对象动态生成(Dynamic Create)的简单实现

本文介绍了如何在C++中模仿Java的动态对象创建机制,包括一个公用基类、一个Class类以及动态生成实例的方法。文章给出了核心代码示例,并讨论了模板类动态创建的两种策略:穷举法和自动注册法,以及遇到的编译器优化问题。
摘要由CSDN通过智能技术生成

以前一直是C++的coder,最近由于到了另一家公司,因此开始写java项目,相信C++的程序员都会对java语言原生支持的动态生成很是羡慕,但是C++不支持反射(reflection),也就无法根据类名动态创建对象,MFC的做法是继承CObject并用DECLARE_DYNCREATE宏来实现,MFC这么实现是由于一些系统遗留问题,感觉用起来不是那么的friendly。今天下午坐着无聊,仿造java的结构构思了下C++的动态生成实现方法。

基本想法:

1.java的所有类都默认继承自Object类,在C++中我们也需要这么一个公用的基类。

2.java中每个类都有对应的一个Class类,用来动态创建类对象,我们也定义一个Class类

3.java中可以用Class.forName(String className)来获得相应的Class类,我们的Class类也应该支持这种方式

4.java中用Class.newInstance()动态生成类的实例,其实Class类在这里就相当于一个Factory,我们也提供这种方式

基本上,只要实现了上述4个条件,类的动态创建就跟java的方式差不多了,具体代码如下:

核心代码:

Class.h

/*
 * C++对象动态创建(Dynamic Create)简单实现
 *使用方法:对每一个需要动态创建的类,继承自Object类,并调用Class::Register<Class>(className)注册一下即可
 *  Created on: 2012-5-11
 *      Author: torytin
 */

#ifndef CLASS_H_
#define CLASS_H_
#include <map>
#include <string>
using namespace std;
/**
 * Object类,需要动态生成的类都必须继承该类
 * 目前该类无任何功能,只是一个标记
 * @author torytin
 */
class Class;
class Object {
public:
	//用来保存创建的Class类
	static const Class *const theClass;
};
/**
 * 对象工厂模板类,该类用来生成具体的对象
 * @author torytin
 *
 */
template<class T> class ObjectFactory {
public:
	static Object *create() {
		return new T();
	}
	;
};
/**
 * Class类,用来存储类信息
 * 为了可以把具体的类型对用户隐藏,Class类没有设成模板类
 * 因为C++的模板类对象持有的时候必须指定具体的类名,如果设定为模板类
 * 使用的时候只能是Class<类名> *pClass,而不能是Class *pClass。
 * 用户还是需要知道具体类名,就失去了动态创建的意义,但为了达到动态创建的目的,
 * Class类的Register是一个template函数,具体的类型信息,需要用户在注册类的时候提供
 * @author torytin
 *
 */
class Class {
private:
	//创建对象的函数指针定义
	Object *(*factory)(void);
	//用来存储当前注册的所有可动态创建的Class
	static map<string, Class*> classMap;
	//类的名称
	string name;
	//Class类不允许外部初始化
	Class() {
	}
public:
	/***
	 * Class类注册函数,该注册函数是template函数。
	 * 用户需要提供T的具体类型和类的唯一标识符(一般为类名),比如生成Example类的Class:
	 * Class::Register<Example>("Example");
	 * 参数:
	 * 		T:具体的类
	 * 		className:注册的名字(一般为类名,也可以为任意字符)
	 */
	template<class T> static Class * Register(string className) {
		if (classMap.count(className)==0) {
			Class *cls = new Class();
			cls->factory = &Objec
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值