在.net c++中调用父窗体的子窗体函数

Child form calling function on parent in .NET c++

本文关键字:窗体 函数 调用 net c++      更新时间:2023-10-16

我有一个应用程序与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-joeydocumentsvisual studio 2010projectspark cleanup 2park cleanup 2Form1.h  2332
Error   25  error C2065: 'TrackEdit' : undeclared identifier (TrackEdit.cpp)    c:users-joeydocumentsvisual studio 2010projectspark cleanup 2park cleanup 2Form1.h  2332
Error   26  error C2065: 'te' : undeclared identifier (TrackEdit.cpp)   c:users-joeydocumentsvisual studio 2010projectspark cleanup 2park cleanup 2Form1.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的函数(如在列表框中选择一个项目),我想实现。

看起来您有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 and TrackEdit.cpp:

#include "Form1.h"
#include "TrackEdit.h"