根據字串類名動態建立對象

來源:互聯網
上載者:User

老闆很無理的要求,硬是讓程式能夠根據給定的字串類名來建立相應的對象,哎,為此折騰了幾天!

////////////////////////reflect.h檔案#ifndef REFLECT_H#define REFLECT_Hclass ClassDef;class __ClassDefiner;typedef void (*ConstructObjectFn)(void *pObject);typedef void (*DestructObjectFn)(void *pObject);//自己重載new運算子inline void * __cdecl operator new(unsigned int size,void* ptr,int le,char ch) {     return ptr;};#define DEFINE_HANDLE_TYPE(name) /    typedef struct TT{int __nothing;} name##_t, *name;//類的建構函式和解構函式#define DO_DEFAULT_FUNCTIONS(_ClassName) /    void Default##_ClassName##Constructor(void *ptr)/{/    new(ptr,(int)0,(char)0) _ClassName;/};/    void Default##_ClassName##Destructor(void *ptr)/{/    _ClassName *thePtr = (_ClassName*)ptr;/    thePtr->~_ClassName();/};/#define DO_AUTO_CLASSLIST(name) /    static __ClassDefiner __##name##_definer(&_##name##_Class__);//#define CLASS_SYMBOL(name, parentSymbol, construct_fn, destruct_fn) /    ClassDef _##name##_Class__ = { /#name, #parentSymbol, /    construct_fn, destruct_fn, /    sizeof(name) ,/}; /    DO_AUTO_CLASSLIST(name) /    __int32 __impl_instance_##name##__;                   class ClassDef {public:    char *m_ClassName;    char *m_ParentClass;    //建構函式和解構函式    ConstructObjectFn m_ConstructFn;    DestructObjectFn m_DestructFn;    // How big an object of this class is (set automatically).    long m_ClassObjectSize;};class __ClassDefiner{public:    __ClassDefiner(ClassDef *pDef);    ClassDef        *m_pClass;    __ClassDefiner  *m_pNext;};#define Declare(CLASSC,CLASSP)  /    DO_DEFAULT_FUNCTIONS(CLASSC)/    CLASS_SYMBOL(CLASSC,CLASSP,Default##CLASSC##Constructor,Default##CLASSC##Destructor)class classMgr {public:    void* GetClassByName(char* _name);};#endif

 

 

///////////////////////reflect.cpp檔案#include "reflect.h"#include <iostream>__ClassDefiner *__g_ClassDefinerHead = NULL;__ClassDefiner::__ClassDefiner( ClassDef *pDef ){    m_pClass = pDef;    m_pNext = __g_ClassDefinerHead;    __g_ClassDefinerHead = this;}void* classMgr::GetClassByName( char* _name ){    __ClassDefiner* cd = __g_ClassDefinerHead;    while (cd)    {        if ( strcmp(cd->m_pClass->m_ClassName ,_name) == 0  )        {            void *p = malloc(cd->m_pClass->m_ClassObjectSize);            cd->m_pClass->m_ConstructFn(p);             return p;        }        cd = cd->m_pNext;    }    return NULL;}
 
////////////////////////測試程式//////////////Base、Derived和Child為自己寫的測試類別,其繼承關係為Derived和Child都繼承於Base///////////////////////建立類似於MFC RTTI的類型識別網Declare(Derived,Base);Declare(Child,Base);int main(){    classMgr cm;    Base* b=(Base *)cm.GetClassByName("Derived");    b->DoSth();    getchar();    free(b);    b=(Base *)cm.GetClassByName("Child");    b->DoSth();    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.