c++实现简单反射

#include <map>
#include <string>
#include <iostream>
using namespace std;
typedef void* (*createClass)(void) ;

class ClassFactory 
{
public:
	ClassFactory(){} ;
 
	virtual ~ClassFactory(){} ;
 
    void* getClassByName(string className) ;
 
    void registClass(string name, createClass method) ;
 
    static ClassFactory& sharedClassFactory() ;
 
private:
    map<string, createClass> m_classMap ;
} ;
void* ClassFactory::getClassByName(string className)
{
    map<string, createClass>::const_iterator iter ;
 
    iter = m_classMap.find(className) ;
    if ( iter == m_classMap.end() )
        return NULL ;
    else
        return iter->second() ;
}
 
void ClassFactory::registClass(string name, createClass method)
{
    m_classMap.insert(pair<string, createClass>(name, method)) ;
}
 
ClassFactory& ClassFactory::sharedClassFactory()
{
    static ClassFactory _sharedClassFactory ;
    return _sharedClassFactory ;
}

class DynamicClass
{
public:
    DynamicClass(string name, createClass method)
    {
        ClassFactory::sharedClassFactory().registClass(name, method) ;
    }
} ;

#define DECLARE_CLASS(className)\
string className##Name ;        \
static DynamicClass* m_##className##dc ;
 
#define IMPLEMENT_CLASS(className)  \
	DynamicClass* className::m_##className##dc = \
         new DynamicClass(#className, className::createInstance) ;

class BaseClass
{
private:
//    DECLARE_CLASS(BaseClass)
 
public:
    BaseClass() {}
    virtual ~BaseClass() {}
	virtual void display(){}
} ;



class HelloClass:public BaseClass{
public:
	DECLARE_CLASS(HelloClass)
    HelloClass() {}
    virtual ~HelloClass(){}
    static void* createInstance()
    {
    	return new HelloClass() ;
    }
    virtual void display()
    {
    	cout << "hello world" << endl ;
    }

 
} ;
IMPLEMENT_CLASS(HelloClass)


int main()
{
	BaseClass *pVar = (BaseClass*)ClassFactory::sharedClassFactory().getClassByName("HelloClass") ;

    pVar->display() ;


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值