1. 程式人生 > >error C2039: classCMenuDlg : is not a member of CMenuDlg

error C2039: classCMenuDlg : is not a member of CMenuDlg

error C2039: classCMenuDlg : is not a member of CMenuDlg

2012年10月11日  ⁄ 綜合 ⁄ 共 1222字 ⁄ 字號      ⁄ 評論關閉

事件回放:

1、在MFC下編寫的.exe可執行程式在打包的時候由於在未安裝vc編譯器或微軟軟體執行環境vcredistx86.exe下無法執行,總是報錯說是什麼什麼並行環境配置有錯,程式無法執行等類似的錯誤提示,解決這一問題最好的方法就是將程式設定為: USE MFC IN  A STATIC LIBRARY.

但是一旦將程式設定為如此後,就會出現error C2039: classCMenuDlg : is not a member of CMenuDlg。

2、在做一個檢視分割的例子,自己用基於CSplitterWnd編寫的一個自定義類;
當利用成員函式建立檢視時:
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMenuDlg),CSize(100,735),pContext)

提示錯誤如下:error C2039: classCMenuDlg : is not a member of CMenuDlg


問題分析:


看到這種錯誤,我們的第一反應是沒有包含標頭檔案,沒錯的有兩種情況:
(1)沒有在MainFrame標頭檔案沒有包含CMenuDlg的標頭檔案,只要包含即可;
(2)當你發現已經包含了標頭檔案還是出錯,那就屬於第二種情況了,我根據自己查詢的資料得到:
CDialog類建立時預設是不支援動態建立,而MFC為了使類支援動態建立,設計了一套用巨集來實現的動態建立機制,在這套巨集中,定義了class+類名的資料成員,也就是你這裡的classCMenuDlg,只有支援動態建立的類,才有這些資料成員和相應的操作。而CDialog類是不支援的。因此錯誤提示中就有classCMenuDlg未定義的提示。


解決辦法


在CMenuDlg類的標頭檔案新增一句即可,新增後為:

class CMenuDlg : public CDialog
{
// Construction
public:
  CMenuDlg(CWnd* pParent = NULL);   // standard constructor
  DECLARE_DYNCREATE(CMenuDlg) //允許動態建立,預設是不允許的

新增完就可以了,可是我發現問題還沒有結束,又來了一個錯誤提示(類似的,當時忘記截圖):

ZLLK.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CZLLKDoc::classCZLLKDoc" ([email protected]@@[email protected]@B)

這下又蒙了,繼續百度,終於解決了,這裡直接給出解決方案(具體的原理推薦閱讀侯捷老師的《MFC深入淺出》的動態建立機制,方法如下:在CMenuDlg類的實現cpp檔案前面新增以下語句(記住不是在內部)

IMPLEMENT_DYNCREATE(CMenuDlg, CDialog)

ok,至此2個問題都解決了,希望對你有幫助。

事件回放:

1、在MFC下編寫的.exe可執行程式在打包的時候由於在未安裝vc編譯器或微軟軟體執行環境vcredistx86.exe下無法執行,總是報錯說是什麼什麼並行環境配置有錯,程式無法執行等類似的錯誤提示,解決這一問題最好的方法就是將程式設定為: USE MFC IN  A STATIC LIBRARY.

但是一旦將程式設定為如此後,就會出現error C2039: classCMenuDlg : is not a member of CMenuDlg。

2、在做一個檢視分割的例子,自己用基於CSplitterWnd編寫的一個自定義類;
當利用成員函式建立檢視時:
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMenuDlg),CSize(100,735),pContext)

提示錯誤如下:error C2039: classCMenuDlg : is not a member of CMenuDlg


問題分析:
看到這種錯誤,我們的第一反應是沒有包含標頭檔案,沒錯的有兩種情況:
(1)沒有在MainFrame標頭檔案沒有包含CMenuDlg的標頭檔案,只要包含即可;
(2)當你發現已經包含了標頭檔案還是出錯,那就屬於第二種情況了,我根據自己查詢的資料得到:
CDialog類建立時預設是不支援動態建立,而MFC為了使類支援動態建立,設計了一套用巨集來實現的動態建立機制,在這套巨集中,定義了class+類名的資料成員,也就是你這裡的classCMenuDlg,只有支援動態建立的類,才有這些資料成員和相應的操作。而CDialog類是不支援的。因此錯誤提示中就有classCMenuDlg未定義的提示。


解決辦法
在CMenuDlg類的標頭檔案新增一句即可,新增後為:

class CMenuDlg : public CDialog
{
// Construction
public:
  CMenuDlg(CWnd* pParent = NULL);   // standard constructor
  DECLARE_DYNCREATE(CMenuDlg) //允許動態建立,預設是不允許的

新增完就可以了,可是我發現問題還沒有結束,又來了一個錯誤提示(類似的,當時忘記截圖):

ZLLK.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CZLLKDoc::classCZLLKDoc" ([email protected]@@[email protected]@B)

這下又蒙了,繼續百度,終於解決了,這裡直接給出解決方案(具體的原理推薦閱讀侯捷老師的《MFC深入淺出》的動態建立機制,方法如下:在CMenuDlg類的實現cpp檔案前面新增以下語句(記住不是在內部)

IMPLEMENT_DYNCREATE(CMenuDlg, CDialog)

ok,至此2個問題都解決了,希望對你有幫助。