.net - 前向声明问题

标签 .net c++ forward-declaration

我正在使用 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/

相关文章:

c++ - 在 Arduino 中选择一个随机的 pwm 引脚

c++ - C++程序的输出

c++ - 前向声明语法的差异

c# - 如何在母版页中只加载一次菜单?

c# - 查找包含进程特定文本的窗口

c# - 如何将逗号分隔的字符串转换为 List<int>

c++ - Borland 5.0 项目文件的格式是什么?

c++ - 关于前向声明 C++ 类

c++ - 对内置数据类型使用前向声明

c# - 无法加载文件或程序集 'System.Web.Extensions'