0

Form1.hとTrackEdit.hの2つのwinformを備えたアプリケーションがあります。それらは両方とも同じ名前空間( "ParkCleanUp2")にあります。

Form1内から、このコードを呼び出します。

ParkCleanUp2::TrackEdit^ te;

それが私にこれらのエラーを与えるところ:

Error   24  error C2039: 'TrackEdit' : is not a member of 'ParkCleanUp2' (TrackEdit.cpp)    c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h  2332
Error   25  error C2065: 'TrackEdit' : undeclared identifier (TrackEdit.cpp)    c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h  2332
Error   26  error C2065: 'te' : undeclared identifier (TrackEdit.cpp)   c:\users\-joey\documents\visual studio 2010\projects\park cleanup 2\park cleanup 2\Form1.h  2332

ただし、TrackEdit.hにアクセスすると、次のように表示されます。

namespace ParkCleanUp2 {
 //Some namespae includes
     public ref class TrackEdit : public System::Windows::Forms::Form

だから、なぜ「'TrackEdit':は'ParkCleanUp2'のメンバーではない」というエラーが表示されるのか、.hファイルをインクルードしているときにTrackEdit.cppファイルを調べているのか疑問に思っています。私が奇妙で、おそらく言及することが重要であることがわかったのは#include "Form1.h、TrackEdit.hで行をコメントすると、それは完璧に機能するが、TrackEdit.hではForm1の関数(リストボックスでアイテムを選択するなど)を呼び出すことができないということです。 )達成したかった。

4

1 に答える 1

2

あなたは Form1.h と TrackEdit.h の両方を持っているようです#include。代わりに、前方宣言を行い、TrackEdit から Form1.h のみを含めます。cpp、およびその逆。

両方のクラスが他方を参照しているため、二重インクルードは機能しません。各クラスは、それ自体を定義するために、他のクラスについて知る必要があります。あなたが持っているのは完全なクラス定義だけなので、循環定義があります。代わりに、前方宣言は、コンパイラが「OK、その名前のクラスがあり、それについて私が知っているのはそれだけです」と知るのに十分なものを提供し、循環依存関係が解決されます。

(また、質問を編集したときに、最も重要な文を削除しました:「基本的に Form1.h には、Form1.h を再度含む TrackEdit.h が含まれています」。そのパターンが正しいことはほとんどありません。代わりに前方宣言を増やしてください。)

このようなもの:

Form1.h:

namespace ParkCleanUp2 {
    ref class TrackEdit;

    public ref class Form1 {
        TrackEdit^ track;
    };
}

TrackEdit.h:

namespace ParkCleanUp2 {
    ref class Form1;

    public ref class TrackEdit {
        Form1^ parentForm;
    };
}

Form1.cpp と TrackEdit.cpp:

#include "Form1.h"
#include "TrackEdit.h"
于 2013-01-13T18:53:33.773 に答える