VS2010創建MFC基類 --- CFormView的派生類

前面做了一基於對話框的基類,詳情見https://blog.csdn.net/yishang44/article/details/99680673。在做基於CFormView的基類時候進行了相似的操作。

//.h文件
class CBaseForm : public CFormView
{
	DECLARE_DYNCREATE(CBaseForm)

protected:
	//CBaseForm();           // protected constructor used by dynamic creation
	CBaseForm(LPCTSTR lpszTemplateName);
	CBaseForm(UINT nIDTemplate);
	
    //////////////////////////////
    ………………………………
    /////////////////////////////
};


//.cpp文件

IMPLEMENT_DYNCREATE(CBaseForm, CFormView)

CBaseForm::CBaseForm(LPCTSTR lpszTemplateName)
	:CFormView(lpszTemplateName)
{

}
CBaseForm::CBaseForm(UINT nIDTemplate)
	:CFormView(nIDTemplate)
{

}

   ////////////////////////////////
    ……………………………………
   ////////////////////////////////

本以爲就結束了,沒想到出了問題。問題如下圖,IMPLEMENT_DYNCREATE宏出現問題。

查看MFC中的源碼,IMPLEMENT_DYNCREATE宏的實現細節

#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
	CObject* PASCAL class_name::CreateObject() \
		{ return new class_name; } \
	IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
		class_name::CreateObject, NULL)

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
	CRuntimeClass* PASCAL class_name::_GetBaseClass() \
		{ return RUNTIME_CLASS(base_class_name); } \
	AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
		#class_name, sizeof(class class_name), wSchema, pfnNew, \
			&class_name::_GetBaseClass, NULL, class_init }; \
	CRuntimeClass* PASCAL class_name::GetThisClass() \
		{ return _RUNTIME_CLASS(class_name); } \
	CRuntimeClass* class_name::GetRuntimeClass() const \
		{ return _RUNTIME_CLASS(class_name); }

這裏可以看到這裏會動態創建一個CBaseForm對象。作爲基類,是不應該存在具體對象的。這裏需要修改宏爲IMPLEMENT_DYNAMIC,與之對應的宏DECLARE_DYNAMIC。

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
	IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)

這裏就沒有動態創建CBaseForm對象了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章