我有一个带有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"