C++ 动态创建

类的动态创建,  相信大家都已经很熟悉了.  

#pragma warning(disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;

class Object;
class ClassInfo;
 
static std::map< string,ClassInfo*> classInfoMap;  //全局map,存放名称,类信息指针对
typedef Object* (*ObjectConstructorFn)(void); 
bool Register(ClassInfo* ci);

class ClassInfo
{
public:
	ClassInfo(const string ClassName,ObjectConstructorFn fun)
		:m_classname(ClassName),m_objectconstructor(fun)
	{ Register(this); }
	virtual ~ClassInfo(){};
	Object* CreateObject()const { return m_objectconstructor ? (*m_objectconstructor)():0;}
	bool IsDynamic()const { return NULL != m_objectconstructor;}
	ObjectConstructorFn GetConstructor()const{ return m_objectconstructor;}
public:
	string m_classname;
	ObjectConstructorFn m_objectconstructor;
};

#define DECLARE_CLASS(name)	\
	protected:	\
		static ClassInfo ms_classinfo;    \
	public:	\
		virtual ClassInfo* GetClassInfo() const; \
		static Object* CreateObject();    //这个createobject是传递给ms_classinfo中, 
										  //当遍历classInfoMap时, 可以用于创建实例

#define IMPLEMENT_CLASS_COMMON(name, func)	\
		ClassInfo name::ms_classinfo(#name, (ObjectConstructorFn)func); \
		ClassInfo* name::GetClassInfo() const\
		{ return &name::ms_classinfo;}

#define IMPLEMENT_CLASS(name)	\
		IMPLEMENT_CLASS_COMMON(name, name::CreateObject) \
		Object* name::CreateObject()\
		{return new name;}
	


class Object
{
	DECLARE_CLASS(Object)
public:
	Object(){};
	virtual ~Object(){};
	static bool Register(ClassInfo* ci);
	static Object* CreateObject(string name);    //基类提供公共接口, 以便其子类拥有动态创建的能力
};
IMPLEMENT_CLASS(Object)

bool Object::Register(ClassInfo* ci) 
{
    if(ci)  {
        if(classInfoMap.find(ci->m_classname) == classInfoMap.end()){
            classInfoMap.insert(std::map< string,ClassInfo*>::value_type(ci->m_classname,ci));
        }
    }
    return true;
}

Object* Object::CreateObject(std::string name)
{
    std::map< string,ClassInfo*>::const_iterator iter = classInfoMap.find(name);
    if(iter != classInfoMap.end() )  {
        return iter->second->CreateObject();
    }   
    return NULL;
}

bool Register(ClassInfo* ci)
{
    return Object::Register(ci);
}

class A:public Object
{
	DECLARE_CLASS(A)
public: 
	A(){cout<<hex<<(long)this<<" A constructor!"<<endl;};
	virtual ~A(){};
};
IMPLEMENT_CLASS(A)

int main(int argc, char* argv[])
{
	Object* a = Object::CreateObject("A");
	printf("Hello World!\n");
	return 0;
}


转载于:https://my.oschina.net/u/262502/blog/343938

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值