.net 远期申报问题
我有两张表格 第一个声明如下.net 远期申报问题,.net,c++,forward-declaration,.net,C++,Forward Declaration,我有两张表格 第一个声明如下 #include "stdafx.h" namespace myNamespace{ public ref class frmMain : public System::Windows::Forms::Form { /*... snip ...*/ public void addNewRow(String^ text){ /*... snip... */ } public void launchSubFor
#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
};
}
现在进入问题!
子窗体中的行导致编译器告诉我“使用未定义类型myNamespace::frmMain
我真的不知道为什么“ref class frmMain”不能解决这个问题,这是因为这两个头文件都包含“stdafx.h”,而stdafx.h在“frmMain.h”之前包含“SubForm.h”
因此,在“SubForm.h”中,编译器希望在定义frmMain之前定义子表单,从而导致错误
解决此问题的正确方法是将类的所有代码保留在适当的源文件中,而不是保留在头文件中。如果头文件只是声明:
public void exportRows(String^ text);
然后您可以定义:
public void SubForm::exportRows(String^ text)
{
/*... snip ...*/
myMain->addNewRow("myNewText");
}
在SubForm.cpp中,一切都会顺利进行
编辑:好的面向对象设计包括将接口与实现分开,C++中最好的方法是在头文件中保持接口和在相应的源文件中实现代码。
<> P> >你的头文件应该只包含声明。把这些看作是你的类的接口。头文件只显示你的类将实现的函数签名。另一方面,源文件包含所有的定义,这些定义是你的类的实现。C++中的 < P>可以打开。如果未对类的指针或引用调用方法,请向前声明该类。任何时候尝试对类指针或引用调用方法时,都需要有可用的类定义 删除不完整的类型是合法的,但非常危险
请使用不同的标签,因为这不是C++ C++。
public void SubForm::exportRows(String^ text)
{
/*... snip ...*/
myMain->addNewRow("myNewText");
}