2013-01-13 91 views
0

我有一個具有2個winforms的應用程序:Form1.h和TrackEdit.h。他們都在相同的名稱空間(「ParkCleanUp2」)。父窗口調用函數.NET C++

從內Form1中我把這個代碼:

ParkCleanUp2::TrackEdit^ te; 

如果它給了我這些錯誤:

Error 24 error C2039: 'TrackEdit' : is not a member of 'ParkCleanUp2' (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332 
Error 25 error C2065: 'TrackEdit' : undeclared identifier (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332 
Error 26 error C2065: 'te' : undeclared identifier (TrackEdit.cpp) c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h 2332 

不過,如果我去TrackEdit.h它告訴我:

namespace ParkCleanUp2 { 
//Some namespae includes 
    public ref class TrackEdit : public System::Windows::Forms::Form 

所以我想知道爲什麼它給了我錯誤「'TrackEdit':不是'ParkCleanUp 2'「以及爲什麼它正在查看TrackEdit.cpp文件,而我包含.h文件。 我發現很奇怪,也許很重要的一點是,當我評論TrackEdit.h中的#include "Form1.h行時,它完美無缺,但在TrackEdit.h中,我無法調用Form1的函數(如選中一個列表框),我想實現。

+0

你能告訴我們你的代碼呢? – antonijn

+0

我唯一能猜到的是你已經使用了'ParkCleanUp2.TrackEdit'而不是'ParkCleanup2 :: TrackEdit',這是真的嗎? – antonijn

+0

@AntonieBlom這是我目前用來運行表單的代碼: ParkCleanUp2 :: TrackEdit^te = gcnew ParkCleanUp2 :: TrackEdit(TrackUIDs [track_list-> SelectedIndex]); > ShowDialog(); 雖然,這一個給我的''TrackEdit':不是'ParkCleanUp2''錯誤的成員,如果我刪除了「ParkCleanUp2 ::」命名空間前綴錯誤消失了,但其他的仍然存在。所以如果我使用這個代碼: TrackEdit^te = gcnew TrackEdit(TrackUIDs [track_list-> SelectedIndex]); > ShowDialog(); 第一個錯誤是固定的,但其他錯誤仍然存​​在。 – LeopardGL

回答

2

看起來你有兩個Form1.h和TrackEdit.h每個#include-另一個。相反,有一個前向聲明,並且只包含來自TrackEdit的Form1.h。 cpp,反之亦然。

double-include不起作用,因爲你有兩個類引用另一個類。每個班級都需要了解其他人才能定義自己。由於您擁有的是完整的類定義,因此您有一個循環定義。相反,前向聲明爲編譯器提供了足夠的信息,使其知道「好的,有一個具有該名稱的類,這就是我所知道的」,並且循環依賴已解決。 (另:當你編輯問題時,你刪除了最重要的句子:「所以基本上Form1.h包含TrackEdit.h,它再次包含Form1.h」,該模式很少是正確的,如果你看到自己這樣做,提供更多的向前聲明代替)

事情是這樣的:

Form1.h:

namespace ParkCleanUp2 { 
    ref class TrackEdit; 

    public ref class Form1 { 
     TrackEdit^ track; 
    }; 
} 

TrackEdit.h:

namespace ParkCleanUp2 { 
    ref class Form1; 

    public ref class TrackEdit { 
     Form1^ parentForm; 
    }; 
} 

Form1.cpp和TrackEdit.cpp:

#include "Form1.h" 
#include "TrackEdit.h" 
+0

這似乎是工作,但我得到了一個新的錯誤,雖然當我用那些向前引用和驗證碼: 'ParkCleanUp2 :: TrackEdit ^時間tr = gcnew ParkCleanUp2 :: TrackEdit();' 錯誤: '錯誤錯誤C2512:'ParkCleanUp2 :: TrackEdit':沒有合適的默認構造函數可用\t c:\ users \ -joey \ documents \ visual studio 2010 \ projects \ park cleanup 2 \ park cleanup 2 \ Form1.h \t 2332' 請注意'TrackEdit^tr;'不會給出任何錯誤。該構造函數如下: '公共引用類TrackEdit:公共系統:視窗:形式:表格 \t { \t市民: \t \t TrackEdit(無效) \t \t { \t \t \t的InitializeComponent() ; \t \t}' – LeopardGL

+0

在頭文件中,沒有可用的類定義,只是前向聲明,所以沒有構造函數,方法,屬性,任何東西。將該行移動到cpp文件中,在該文件中提供完整的類定義。 –

+0

不知何故,這似乎也不是正確的方法。當我創建一個新的表單應用程序來完全按照您所說的那樣來嘗試此代碼時,它不起作用,因爲它不會編譯帶有「public」前綴的「public ref class Form1」('public'只能用於定義,它說)。它雖然提供了一個可能有用的錯誤:「頂級可見性說明符需要類型定義」。我以某種方式做錯了嗎? – LeopardGL

相關問題