0

我有一个带有 2 个 winform 的应用程序: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': is not a member of 'ParkCleanUp2' ”以及为什么它在查看 TrackEdit.cpp 文件,而我包含 .h 文件。我发现很奇怪,也许值得一提的是,当我#include "Form1.h在 TrackEdit.h 中评论该行时,它工作得很好,但在 TrackEdit.h 中我不能调用 Form1 的函数(比如在列表框中选择了一个项目) 我想要实现的。

4

1 回答 1

2

看来您同时拥有 Form1.h 和 TrackEdit.h #include。相反,有一个前向声明,并且只包括来自 TrackEdit 的 Form1.h。cpp,反之亦然。

双重包含不起作用,因为您有两个类都引用了另一个。每个类都需要了解其他类才能定义自己。由于您所拥有的只是完整的类定义,因此您有一个循环定义。相反,前向声明为编译器提供了足以让编译器知道“好的,有一个具有该名称的类,这就是我所知道的一切”,并且解决了循环依赖。

(另外:当您编辑问题时,您删除了最重要的句子:“所以基本上 Form1.h 包含 TrackEdit.h,其中又包含 Form1.h”。这种模式很少是正确的。如果您看到自己这样做,请提供而是更多的前向声明。)

像这样的东西:

表格1.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"
于 2013-01-13T18:53:33.773 回答