我正在使用 C++ .NET 2.0
我有两个表格
第一个声明如下
#include "stdafx.h"
namespace myNamespace{
public ref class frmMain : public System::Windows::Forms::Form {
/*... snip ...*/
public void addNewRow(String^ text){ /*... snip... */ }
public void launchSubForm() { SubForm^ sf = gcnew SubForm(this); sf->Show(); }
};
}
第二个是这样的
#include stdafx.h
namespace myNamespace{
ref class frmMain;
public ref class SubForm : public System::Windows::Forms::Form {
frmMain^ myMain;
SubForm ( frmMain^ pMain){
myMain = pMain;
}
/*... snip ...*/
public void exportRows(String^ text){ /*... snip... */ }
myMain->addNewRow("myNewText"); <--- This line causes compile error
};
}
在 stdafx.h 我有
/*... snip... */
#include "SubForm.h"
#include "frmMain.h"
现在开始提问! SubForm 中的行导致编译器告诉我“使用未定义类型 myNamespace::frmMain
我真的不知道为什么“ref class frmMain”不能解决这个问题
最佳答案
这是因为这些头文件均包含“stdafx.h”,而stdafx.h包含“SubForm.h”之前“frmMain.h”。
因此,在“SubForm.h”中,编译器希望在定义 frmMain 之前定义 SubForm,从而导致错误。
解决这个问题的正确方法是将类的所有代码保存在适当的源文件中,不要在头文件中。如果您的头文件只是声明:
public void exportRows(String^ text);
然后你可以定义:
public void SubForm::exportRows(String^ text)
{
/*... snip ...*/
myMain->addNewRow("myNewText");
}
在 SubForm.cpp 中,一切都应该非常顺利。
编辑:良好的面向对象设计涉及将接口(interface)与实现分离,在 C++ 中实现这一点的最佳方法是将接口(interface)保留在头文件中,将实现代码保留在相应的源文件中。
底线是你的头文件应该只包含声明。将这些视为您的类的接口(interface)。头文件仅显示您的类将实现的函数签名。另一方面,源文件包含所有定义,它们是类的实现。
关于.net - 前向声明问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/376232/