2011-02-02 57 views
0

我已經創建了一個名爲windowstestapp的Windows窗體應用程序。然後我創建了一個類調用EXTENDING.CPP,其中我添加了一個函數調用add(),該函數從form1類創建一個對象並獲取計算的文本框值。 當我嘗試在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

你爲什麼`#include`-ING .cpp文件? – robert 2011-02-02 16:53:06

回答

1

你似乎混淆源文件的概念,包含文件。

簡單地解釋,在++有兩種類型的文件C:

  • 源文件包含的源代碼。這是將在您的應用程序中執行的代碼。源文件通常具有擴展名.CPP。
  • 包含文件包含聲明。它們只描述應用程序中的元素,但不包含源代碼。包含文件通常具有擴展名.H。

源文件可以包含包含文件,包含文件可以包含其他包含文件。源文件從不包含在其他文件中。它們被編譯並鏈接在一起。

對你而言,在form1.h中包含「Extending.cpp」顯然是不正確的。

嘗試將代碼拆分爲清晰的包含文件和源文件。這意味着:它包含表單類

  • EXTENDING.H其中包含類聲明的代碼

    • FORM1.H其中包含類的聲明,但沒有源代碼
    • FORM1.CPP,但沒有源代碼
    • extending.cpp中包含的擴展類的源代碼

    你會發現,FORM1.H將不需要EXTENDING.H,反之亦然。

    另一方面,FORM1.CPP可能需要FORM1.H和EXTENDING.H,並且可能EXTENDING.CPP可能需要FORM1.H和EXTENDING.H,但這不是問題。

    現在編譯兩個CPP文件並將它們鏈接在一起。一旦你獲得了更多的C++經驗,你會發現確實有可能將源代碼放入包含文件(使內聯成爲可能)並擁有循環依賴關係(使用前向聲明),但首先開始獲得更多的經驗C++。

    編輯:

    如果在Form1的東西,需要EXTENDING.H,它可以是下列情況之一:

    • 你這就需要的定義內聯方法擴展類 - >將該方法移到form1.cpp。
    • 您在Form1中的成員是一個指向擴展類 - >使用前聲明(編譯器並不真正需要知道一個類的完整定義,以便能夠用於存儲指針生成代碼)
    • 您在Form1中有一個成員是Extending的實例 - >那麼您確實需要在FORM1.H中包含EXTENDING.H
    • 您的Form1類繼承自Extending - >那麼您確實需要包含EXTENDING .H
    • 在Form1中有一個數據類型需要在擴展中定義一些東西(可以是枚舉) - >那麼您確實需要在FORM1.H中包含EXTENDING.H

    檢查同爲周圍的其他方式。

    如果您仍然有循環依賴,拔出,導致依賴的成員,把他們在不同的類,然後可以通過兩種EXTENDING.H和FORM1.H使用。

  • +0

    thnx爲您的答案,但這仍然困惑我可以看看@我的答案。 – Mafas 2011-02-03 04:02:37

    0

    我已經使用MVC模式做到了這一點。我從視圖中分離出模型。我使用了一個單獨的類來保存我的表單值。使用該類,我獲得了所需的參數。這現在工作正常。