Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 远期申报问题_.net_C++_Forward Declaration - Fatal编程技术网

.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");
}