在.NET c ++中,子窗体调用父级的函数

时间:2013-01-13 18:00:27

标签: c++ .net winforms c++-cli

我正在申请2个winforms:Form1.h和TrackEdit.h。它们都在同一名称空间中(“ParkCleanUp2”)。

从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':不是'ParkCleanUp2'的成员”以及它为什么要查看TrackEdit.cpp文件,而我包括.h文件。 我发现奇怪的,也许重要的是,当我在TrackEdit.h中评论#include "Form1.h行时,它只是完美的,但是在TrackEdit.h中我不能调用Form1的函数(比如选中)我希望实现的列表框中的项目。

1 个答案:

答案 0 :(得分:2)

看来你们每个#include都有Form1.h和TrackEdit.h。相反,有一个前向声明,只包含TrackEdit中的Form1.h。 cpp ,反之亦然。

双包含不起作用,因为你有两个类引用另一个。每个类都需要了解另一个类才能定义自己。既然你拥有的是完整的类定义,那么你就有了一个循环定义。相反,前向声明提供了足够的编译器知道“好的,有一个具有该名称的类,这就是我所知道的”,并且循环依赖性得到了解决。

(另外:当您编辑问题时,您删除了最重要的句子:“所以基本上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"