2008-12-17 64 views
1

我使用C++ .NET 2.0正向聲明問題

我有2種形式

第一個被聲明爲遵循

#include "stdafx.h" 
    namespace myNamespace{ 

     public ref class frmMain : public System::Windows::Forms::Form { 
     /*... snip ...*/ 
     public void addNewRow(String^ text){ /*... snip... */ } 
     public void launchSubForm() { SubForm^ sf = gcnew SubForm(this); sf->Show(); } 

     }; 
    } 

第二個是這樣

#include stdafx.h 
    namespace myNamespace{ 
     ref class frmMain; 
     public ref class SubForm : public System::Windows::Forms::Form { 
     frmMain^ myMain; 
     SubForm (frmMain^ pMain){ 
     myMain = pMain; 
     } 
     /*... snip ...*/ 
     public void exportRows(String^ text){ /*... snip... */ } 
     myMain->addNewRow("myNewText"); <--- This line causes compile error 
     }; 
    } 

in stdafx.hi have

/*... snip... */ 
#include "SubForm.h" 
#include "frmMain.h" 

現在來回答這個問題! 在窗體上線使編譯器告訴我「使用未定義類型myNameSpace對象的:: frmMain

我真的沒有爲什麼線索‘引用類frmMain’犯規解決這個問題

回答

3

這是因爲兩這些頭文件的包括「stdafx.h中」,並stdafx.h中包括「SubForm.h」 之前「frmMain.h」。

因此,在「SubForm.h」,編譯器要定義子窗體在frmMain被定義之前,導致錯誤。

解決此問題的正確方法是將所有類的代碼保存在相應的源文件中,並且而不是位於標題中。如果你的頭文件僅僅聲明:

public void exportRows(String^ text);

,那麼你可以定義:

public void SubForm::exportRows(String^ text) 
{ 
    /*... snip ...*/ 
    myMain->addNewRow("myNewText"); 
}
在SubForm.cpp

,一切都應該制定出出色。


編輯:良好的面向對象設計,包括接口和實現分離,並以最好的方法在C++中是保持在頭文件和實現代碼的接口在相應的源文件。

底線是你的頭文件應該只包含聲明。把這些看作是你的類的接口。頭文件只顯示你的類將實現的函數簽名。另一方面,源文件包含所有定義,這是您的類的實現。

+0

好吧 我現在真的很笨,但謝謝! =) – Eric 2008-12-17 23:11:49

0

在C++中,如果您不是在指針或引用該類上調用方法,則只能轉發聲明類。每當你試圖調用一個類指針或引用的方法時,你都需要有類定義可用。

刪除不完整的類型是合法的,但非常危險。

請使用與C++不同的標籤,因爲這不是C++。