RUNTIME_CLASS 메크로 사용

By | 2014년 6월 5일
#include "stdafx.h"
#define DEBUG
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)
#define DECLARE_DYNAMIC(class_name) static CRuntimeClass class##class_name;
#define IMPLEMENT_DYNAMIC(class_name) CRuntimeClass class_name::class##class_name={(#class_name),sizeof(class_name),class_name::CreateObject};
#define DECLARE_DYNCREATE(class_name) static CObject* CreateObject();
#define IMPLEMENT_DYNCREATE(class_name) CObject* class_name::CreateObject(){return new class_name;}

class CObject;

//struct CRunTimeClass
struct CRuntimeClass{
    char m_lpszClassName[21];
	int m_nObjectSize;
	CObject* (*pfnCreateObject)(); //함수포인트

	CObject* CreateObject();
};

CObject* CRuntimeClass::CreateObject(){
	return (*pfnCreateObject)();
}

class CObject {
public:
	//static CRuntimeClass classCObject;
	DECLARE_DYNAMIC(CObject)
	virtual CRuntimeClass* GetRuntimeClass()  const { return NULL;}
	virtual ~CObject(){}
protected:
	CObject() {printf("CObject constructor\n");}
};

CRuntimeClass CObject::classCObject={"CObject",sizeof(CObject),NULL};

//class CAlpha
class CAlpha : public CObject
{
public:
	//static CRuntimeClass classCAlpha;
	DECLARE_DYNAMIC(CAlpha)
	//static CObject* CreateObject();
	DECLARE_DYNCREATE(CObject)
	virtual CRuntimeClass* GetRuntimeClass() const{
		return &classCAlpha;
	}
protected:
	CAlpha() {printf("CAlpha constructor\n");
	};
};

//CRuntimeClass CAlpha::classCAlpha={"CAlpha",sizeof(CAlpha),CAlpha::CreateObject};
IMPLEMENT_DYNAMIC(CAlpha)

//CObject* CAlpha::CreateObject(){
//	return new CAlpha;
//}
IMPLEMENT_DYNCREATE(CAlpha)

void main()
{
	//Create CAlpha
	//CRuntimeClass* pRTCAlpha=RUNTIME_CLASS(CAlpha);
	CRuntimeClass* pRTCAlpha=(&CAlpha::classCAlpha);
	CObject* pObj1;

	pObj1=pRTCAlpha->CreateObject();
	//CAlpha의 &OnCreate()가 대입(함수포인터에 의해)
	printf("CAlpha class=%s\n",pObj1->GetRuntimeClass()->m_lpszClassName);

	delete pObj1;

#ifdef DEBUG
	//cmd
	char e;
	scanf("%c",&e);
#endif
}
Category: C++