0

我有form1和form2。要打开 form2,我们应该点击按钮 btn。我们使用指针 f2 指向 form2 的指针,然后使用 show(this) 打开它,我们使用公共函数 DialogClosed 使 f2 指向 nullptr。

在 Form1.hi 中有:

#include "Form2.h"
Private: Form2^ f2;
namespace WinDialog 
{
 private: System::Void btn_Click(System::Object^  sender, System::EventArgs^e) 
  {
   if (f2== nullptr)
      {
       f2=gcnew Form2();
       f2->Show(this);
      }
  else
     f2->Activate();
}

public: void DialogClosed( )
  {          
   f2= nullptr;
  }
}

在 Form2.hi 中有:

private:System::Void Form2_FormClosed(Object^ FormClosedEventArgs^e);

在 Form2.cpp 我有:

#include "stdafx.h"
#include "Form1.h"
namespace WinDialog
{
  System::Void Form2::Form2_FormClosed(Object^ sender, FormClosedEventArgs^ e)
   {        
    Form1^ temp = (Form1^)this->Owner;
    temp->DialogClosed();//hier we call the public function in Form1.
   }
}

我的问题:为什么我们应该在实现文件中而不是在头文件中编写定义 Form2_FormClosed。我试图在头文件中写入定义,但它不起作用。我需要你的帮助,请给我你的意见。

4

1 回答 1

0

头文件通常存储函数定义。它们还可以存储方法实现,例如:

inline string method() {
    return something;
}

但是你必须注意你的参考资料。您的函数在标头中不起作用的最可能原因是您没有对所需的 Form1.h 标头的引用。在您的 Form2 cpp 文件中,您包含对 Form1.h 的引用。标题的问题是您可能很快就会产生循环依赖。Form2.h 需要对 Form1.h 的引用,但是 Form1.h 需要对 Form2.h 的引用,依此类推。因此,通过将您的实现放在 cpp 区域中,您可以提供您需要的所有标头引用,而无需担心循环依赖。

于 2013-07-15T14:36:25.077 回答