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(); }

      };
    }

2つ目はこうなる

#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.hi には

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

では質問へ!SubForm の行により、コンパイラは「未定義の型 myNamespace::frmMain の使用」を通知します

「ref class frmMain」がこの問題を解決しない理由について、私は本当に手がかりがありません

4

2 に答える 2

3

これは、これらのヘッダーファイルの両方に「stdafx.h」が含まれており、stdafx.hに「frmMain.h」の前に「SubForm.h」が含まれているためです。

そのため、「SubForm.h」では、コンパイラはfrmMainが定義される前にSubFormを定義しようとしているため、エラーが発生します。

この問題を解決する適切な方法は、クラスのすべてのコードをヘッダーではなく、適切なソースファイルに保持することです。ヘッダーファイルが単に宣言している場合:

public void exportRows(String^ text);

次に、以下を定義できます。

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

SubForm.cppにあり、すべてが見事に機能するはずです。


編集:優れたオブジェクト指向設計には、インターフェイスを実装から分離することが含まれます。C++でこれを実現する最善の方法は、インターフェイスをヘッダーファイルに、実装コードを対応するソースファイルに保持することです。

肝心なのは、ヘッダーファイルには宣言のみを含める必要があるということです。これらをクラスへのインターフェースと考えてください。ヘッダーファイルには、クラスが実装する関数シグネチャのみが表示されます。一方、ソースファイルには、クラスの実装であるすべての定義が含まれています。

于 2008-12-17T22:31:06.607 に答える