仿MFC實現c++的按名動態建立對象功能

來源:互聯網
上載者:User

 類似於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;
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.