2011-02-02 6 views
0

私はwindowstestappという名前のWindowsフォームアプリケーションを作成しました。次に、私はフォーム呼び出しEXTENDING.CPPを作成しました。ここでは、form1クラスからオブジェクトを作成し、計算のテキストボックス値を取得する関数呼び出しadd()を追加しました。 問題は、form1クラス内でEXTENDINGオブジェクトのインスタンスを作成しようとしたときに発生します。これでオブジェクトを作成することはできません。circuler dependancies VC++

私は問題が双方向の依存関係であると信じています。誰も私を助けることができますか? Form1.hため

コード: (私は唯一の重要なコードを使用します)

namespace windowstestapp { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

#include "Extending.h" 
#include "Extending.cpp" 

public ref class Form1 : public System::Windows::Forms::Form 
    { 

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 

     Extending ^e1=gcnew Extending(); 

     } 
    }; 
} 

Extending.cpp:

#include "StdAfx.h" 
#include "Extending.h" 
#include "Form1.h" 

Extending::Extending(void) 
{ 
} 

double Extending::add() 
{ 

    double value=0; 
    windowstestapp::Form1 ^f1=gcnew windowstestapp::Form1(); 

    value=f1->getDistance(); 

    return value; 
} 
+0

なぜあなたは '.cpp 'ファイルをインクルードしていますか?あなたの答えは – robert

答えて

1

あなたは、ソースファイルの概念を混乱させているように見えるとインクルードファイル。

  • ソースファイルは、ソースコードが含まれています。

    は、単にあなたがファイルの2種類があり、C++で、説明しました。これはアプリケーションで実行されるコードです。ソースファイルは通常、拡張子が.CPPです。

  • インクルードファイルには宣言が含まれています。アプリケーション内の要素のみを記述しますが、ソースコードは含みません。インクルードファイルの拡張子は.Hです。

ソースファイルにはインクルードファイルを含めることができ、インクルードファイルには他のインクルードファイルを含めることができます。ソースファイルは決して他のファイルには含まれません。それらは一緒にコンパイルされリンクされています。

あなたの場合、form1.hの "Extending.cpp"のインクルードは明らかに間違っています。

コードを明確なインクルードファイルとソースファイルに分割してください。

  • クラス宣言が含まれているFORM1.Hが、クラスの宣言が含まれているフォームのクラス
  • EXTENDING.Hのコードが含まれていないソースコード
  • FORM1.CPPを、ない:これは、あなたはFORM1.Hその逆EXTENDING.Hとを必要としないことに気づくでしょう

拡張クラスのソースコードが含まれているソースコード

  • EXTENDING.CPP。

    一方、FORM1.CPPにはFORM1.HとEXTENDING.Hの両方が必要な場合があり、おそらくEXTENDING.CPPにはFORM1.HとEXTENDING.Hの両方が必要な場合がありますが、それは問題ではありません。

    ここで、両方のCPPファイルをコンパイルしてリンクします。

    C++の経験が増えれば、インクルードファイルにソースコードを入れて(インライン化を可能にする)、循環依存性(前方宣言を使用して)を持たせることは可能ですが、 C++。

    EDIT:

    EXTENDING.Hを必要とForm1の中で何かがあれば、それは次のような場合のいずれかになります。

    • あなたは、の定義を必要とするインラインメソッドを持っていますExtending class - >メソッドをform1.cppに移動します。
    • Form1には、Extendingクラスへのポインタであるメンバーがあります - >前方宣言を使用します(ポインタを格納するコードを生成するためにコンパイラはクラスの完全な定義を知る必要はありません)
    • Form1にはExtendingのインスタンスであるメンバがあります - >次に、FORM1.HにEXTENDING.Hを含める必要があります
    • Form1クラスはExtending - >継承しますが、実際にEXTENDINGを含める必要があります.H in FORM1.H
    • Form1には、Extending(列挙型)の定義が必要なデータ型があります。>次に、FORM1.HにEXTENDING.Hを含める必要があります。

    他の方法でも同じことを確認してください。

    依然として循環依存関係がある場合は、依存関係の原因となっているメンバーを引き出し、別のクラスに入れてから、EXTENDING.HとFORM1.Hの両方で使用できます。

  • +0

    thnxですが、これはまだ私が@私の答えを見ることができます混乱させる。 – Mafas

    0

    私はこれをMVCパターンを使って行っています。モデルをビューから切り離しました。フォームの値を保持する別のクラスを使用しました。そのクラスを使用して、要求されたパラメータを取得しました。これは今では問題なく動作します。