2008-12-17 65 views
1

我使用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 
     }; 
    } 

in stdafx.hi have

/*... snip... */ 
#include "SubForm.h" 
#include "frmMain.h" 

现在来回答这个问题! 在窗体上线使编译器告诉我“使用未定义类型myNameSpace对象的:: frmMain

我真的没有为什么线索‘引用类frmMain’犯规解决这个问题

回答

3

这是因为两这些头文件的包括“stdafx.h中”,并stdafx.h中包括“SubForm.h” 之前“frmMain.h”。

因此,在“SubForm.h”,编译器要定义子窗体在frmMain被定义之前,导致错误。

解决此问题的正确方法是将所有类的代码保存在相应的源文件中,并且而不是位于标题中。如果你的头文件仅仅声明:

public void exportRows(String^ text);

,那么你可以定义:

public void SubForm::exportRows(String^ text) 
{ 
    /*... snip ...*/ 
    myMain->addNewRow("myNewText"); 
}
在SubForm.cpp

,一切都应该制定出出色。


编辑:良好的面向对象设计,包括接口和实现分离,并以最好的方法在C++中是保持在头文件和实现代码的接口在相应的源文件。

底线是你的头文件应该只包含声明。把这些看作是你的类的接口。头文件只显示你的类将实现的函数签名。另一方面,源文件包含所有定义,这是您的类的实现。

+0

好吧 我现在真的很笨,但谢谢! =) – Eric 2008-12-17 23:11:49

0

在C++中,如果您不是在指针或引用该类上调用方法,则只能转发声明类。每当你试图调用一个类指针或引用的方法时,你都需要有类定义可用。

删除不完整的类型是合法的,但非常危险。

请使用与C++不同的标签,因为这不是C++。