我正在使用C ++ .NET 2.0
我有2个表格
第一个声明如下
#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”没有解决这个问题
答案 0 :(得分:3)
这是因为这两个头文件中的包括“stdafx.h”,而stdafx.h包含“subForm.h”之前的“frmMain.h”。< / p>
因此,在“SubForm.h”中,编译器想要在定义frmMain之前定义SubForm,从而导致错误。
解决此问题的正确方法是将类的所有代码保存在相应的源文件中,并在标题中 not 。如果您的头文件只是声明:
public void exportRows(String^ text);
然后你可以定义:
public void SubForm::exportRows(String^ text)
{
/*... snip ...*/
myMain->addNewRow("myNewText");
}
在SubForm.cpp中,一切都应该很好。
编辑:良好的面向对象设计涉及将接口与实现分离,在C ++中实现此目的的最佳方法是将头文件和实现代码中的接口保存在相应的源文件中。
底线是您的头文件应仅包含声明。可以将它们视为类的接口。头文件仅显示您的类将实现的函数签名。另一方面,源文件包含所有定义,它们是类的实现。
答案 1 :(得分:0)
在C ++中,如果不在指针上调用方法或对该类的引用,则只能转发声明类。每次尝试在类指针或引用上调用方法时,都需要使用类定义。
删除不完整的类型是合法的,但非常危险。
请使用与C ++不同的标签,因为这不是C ++。