2013-01-13 40 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