仿MFC实现c++的按名动态创建对象功能

 类似于CObject的基类BaseClass、类似于CRuntimeClass的RuntimeClass和相关宏的定义头文件如下:

//BaseClass.h

#ifndef BASECLASS_H
#define BASECLASS_H

#include <iostream>

class BaseClass;

struct RuntimeClass
{
    char *classname;
    BaseClass* (*pCreateFn)();

    void* CreateObject();
    static RuntimeClass* LoadByName(std::string classname);

    static RuntimeClass *pFirstClass;
    RuntimeClass *pBaseClass;
    RuntimeClass *pNextClass;
};

struct Class_List
{
    Class_List(RuntimeClass* pNewClass);
};

#define Runtime_Class(classname) /
    (&classname::class##classname)


#define Declare_RTTI(classname) /
    public: /
        static RuntimeClass class##classname; /
        virtual RuntimeClass* GetRuntimeClass() const; /


#define Implement_RTTI(classname,basename) /
    static char lpsz##classname[]=#classname; /
    RuntimeClass classname::class##classname= /
    { lpsz##classname,NULL,Runtime_Class(basename),NULL}; /
    static Class_List _init_##classname(&classname::class##classname); /
    RuntimeClass* classname::GetRuntimeClass() const /
    { return &classname::class##classname;} /


#define Declare_DynCreate(classname) /
    Declare_RTTI(classname) /
    static BaseClass* CreateObject(); /

#define Implement_DynCreate(classname,basename) /
    BaseClass* classname::CreateObject() /
    { return new classname; } /
    static char lpsz##classname[]=#classname; /
    RuntimeClass classname::class##classname= /
    { lpsz##classname,classname::CreateObject,Runtime_Class(basename),NULL}; /
    static Class_List _init_##classname(&classname::class##classname); /
    RuntimeClass* classname::GetRuntimeClass() const /
    { return &classname::class##classname;} /

 

class BaseClass
{
public:
    virtual RuntimeClass* GetRuntimeClass() const
    {
        return &BaseClass::classBaseClass;
    }
    virtual void printClassName() { std::cout<<"BaseClass!/n";}
public:
    static RuntimeClass classBaseClass;
};

#endif

 

 

//BaseClass.cpp

#include "BaseClass.h"

 

RuntimeClass* RuntimeClass::pFirstClass=NULL;

static char lpszBaseClass[]="BaseClass";

RuntimeClass BaseClass::classBaseClass ={lpszBaseClass,NULL,NULL,NULL};

static Class_List _init_BaseClass(&BaseClass::classBaseClass);

Class_List::Class_List(RuntimeClass* pNewClass)
{
    pNewClass->pNextClass=RuntimeClass::pFirstClass;
    RuntimeClass::pFirstClass=pNewClass;
}


void* RuntimeClass::CreateObject()
{
    if (pCreateFn == NULL)
    {
        return NULL;
    }

    void* pObject = NULL;
    pObject = (*pCreateFn)();

    return pObject;
}

RuntimeClass* RuntimeClass::LoadByName(std::string classname)
{
    RuntimeClass* pClass;
    for (pClass = pFirstClass; pClass != NULL; pClass = pClass->pNextClass)
    {
        if (strcmp(classname.c_str(), pClass->classname) == 0)
            return pClass;
    }
    return NULL;
}

 

 

///三个测试类ClassA,ClassB,ClassAS

#pragma once
#include "baseclass.h"

class ClassA :
    public BaseClass
{
    Declare_DynCreate(ClassA)
public:
    ClassA(void);
public:
    ~ClassA(void);
public:
    void printClassName()
    {
        std::cout<<"ClassA!/n";
    }
public:
    void dosth()
    {
        std::cout<<"dosth/n";
    }
};

 

#include "ClassA.h"

Implement_DynCreate(ClassA,BaseClass)

ClassA::ClassA(void)
{
}

ClassA::~ClassA(void)
{
}

 

/

#pragma once
#include "baseclass.h"

class ClassB :
    public BaseClass
{
    Declare_DynCreate(ClassB)
public:
    ClassB(void);
public:
    ~ClassB(void);
public:
    void printClassName()
    {
        std::cout<<"ClassB/n";
    }
};

 

#include "ClassB.h"

Implement_DynCreate(ClassB,BaseClass)

ClassB::ClassB(void)
{
}

ClassB::~ClassB(void)
{
}

#pragma once
#include "classa.h"

class ClassAS :
    public ClassA
{
    Declare_DynCreate(ClassAS)
public:
    ClassAS(void);
public:
    ~ClassAS(void);
public:
    void printClassName()
    {
        std::cout<<"ClassAS/n";
    }
};

 

#include "ClassAS.h"

Implement_DynCreate(ClassAS,ClassA)

ClassAS::ClassAS(void)
{
}

ClassAS::~ClassAS(void)
{
}

 

 

测试

#include "BaseClass.h"
#include <iostream>
#include "ClassA.h"

using namespace std;

#define DOTEST(classname,varname) /
    classname *##varname=new classname(); /
    varname->dosth(); /

 


int _tmain(int argc, _TCHAR* argv[])
{
    RuntimeClass* prc;
    for(prc=RuntimeClass::pFirstClass;prc!=NULL;prc=prc->pNextClass)
    {
        cout<<prc->classname;
        if(prc->pBaseClass!=NULL)
            cout<<"--"<<prc->pBaseClass->classname<<endl;
        else
            cout<<"--NULL"<<endl;
    }
    getchar();

    prc=RuntimeClass::LoadByName("ClassAS");
    ClassA* pb=(ClassA*)prc->CreateObject();
    pb->printClassName();

    DOTEST(ClassA,ca)

    getchar();

 return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值