我有一个带有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':不是'ParkCleanUp2'的成员”,为什么当我包含.h文件时却要查找TrackEdit.cpp文件。
我发现很奇怪,甚至可能需要提及的是,当我在TrackEdit.h中注释#include "Form1.h行时,它的工作原理很完美,但是在TrackEdit.h中,我无法调用Form1的函数(例如选择一个项)在列表框中)。

最佳答案

看来您同时都有Form1.h和TrackEdit.h,并且彼此都#include。而是具有前向声明,并且仅包括TrackEdit.cpp中的Form1.h,反之亦然。

双重包含无效,因为两个类都引用了另一个类。为了定义自己,每个类都需要了解另一个。由于您只拥有完整的类定义,因此有了循环定义。而是,前向声明为编译器提供了足够的知识:“确定,有一个具有该名称的类,这就是我所知道的全部”,并且循环依赖关系得以解决。

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

09-10 13:39