MFC框架仿真---(1)类别信息网之IsKindOf()【型别辨识】

本次仿真的主要内容:在构建好类别信息网的基础上为对象添加型别辨识能力(也就是一个对象可以判断自己是否属于类别信息网中的某一个类类型)

构建类别信息网

修改部分:

mfc.h

/**************************************************************************************
 * 类名称	:CObject
 * 功能		:
 * 当前版本 :1.0
 * 作者		:张群伟
 * 日期		:[4/2/2017]
 **************************************************************************************/
class CObject
{
public:
	CObject() {	}
	~CObject() { }

	// 特性
public:
	static CRuntimeClass classCObject;

	// 操作
public:
	virtual CRuntimeClass* GetRuntimeClass() const;
	BOOL IsKindOf(const CRuntimeClass* pClass) const;	// 添加部分
};

 
 

mfc.cpp

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// CObject
CRuntimeClass* CObject::GetRuntimeClass() const
{
	return &CObject::classCObject;
}
// 添加部分
/**************************************************************************************
 * 函数名	:IsKindOf
 * 功能		:能在执行时期侦测某个对象是否「属于某种类别」,并传回TRUE 或FALSE
 * 参数		:pClass	匹配的类
 * 返回值   : TRUE	对象与类别匹配
 *			  FALSE	对象与类别不匹配
 * 说明  	:
 * 作者		:张群伟
 * 日期		:[4/5/2017]
 **************************************************************************************/
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
	CRuntimeClass* pClassThis = GetRuntimeClass();
	while (pClassThis != NULL)
	{
		if (pClassThis == pClass)
			return TRUE;
		pClassThis = pClassThis->m_pBaseClass;
	}
	return FALSE;		// 没有匹配
}


 
 my.h 
 

/**************************************************************************************
 * 类名称	:CMyDoc
 * 功能		:资料类
 * 当前版本 :1.0
 * 作者		:张群伟	
 * 日期		:[4/5/2017]
 **************************************************************************************/
class CMyDoc : public CDocument
{
	DECLARE_DYNAMIC(CMyDoc)	// 添加部分
public:
	CMyDoc()	{	}
	~CMyDoc()	{	}
};


my.cpp

#include "my.h"
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 注册类别信息
IMPLEMENT_DYNAMIC(CMyDoc, CDocument)	// 添加部分

......

/**************************************************************************************
 * 函数名	:main函数
 * 功能		:MFC中被隐藏的main函数
 * 参数		:void
 * 返回值   : void
 * 说明  	:
 * 作者		:张群伟
 * 日期		:[4/2/2017]
 **************************************************************************************/
int main(void)
{
	cout << "main start !\n" << endl;
	CWinApp* pApp = AfxGetApp();
	// 添加部分
	CMyDoc* pMyDoc = new CMyDoc;
	CMyView* pMyView = new CMyView;
	// CMyDoc 已经注册到类别信息网中
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CMyDoc))		<< endl;// 1
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CDocument))	<< endl;// 1
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CCmdTarget)) << endl;// 1
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CObject))	<< endl;// 1
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CWinApp))	<< endl;// 0
	cout << pMyDoc->IsKindOf(RUNTIME_CLASS(CView))<<"\n"<< endl;// 0
	// CMyView 未注册到类别信息网中
	cout << pMyView->IsKindOf(RUNTIME_CLASS(CView))		<< endl;// 1
	cout << pMyView->IsKindOf(RUNTIME_CLASS(CObject))	<< endl;// 1
	cout << pMyView->IsKindOf(RUNTIME_CLASS(CWnd))		<< endl;// 1
	cout << pMyView->IsKindOf(RUNTIME_CLASS(CFrameWnd)) << endl;// 0

	// 完成每一个程序只做一次的动作
	pApp->InitApplication();
	// 完成每一个个体都得做一次的动作
	pApp->InitInstance();
	// 运行
	pApp->Run();
	// 打印类别信息网
	PrintAllClass();

	cout << "main end !" << endl;
	getchar();
}


实验结果:


附上项目源码:http://download.csdn.net/detail/w__l__/9804396

猜你喜欢

转载自blog.csdn.net/W__L__/article/details/69267393