2011-02-02 22 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模式做到了这一点。我从视图中分离出模型。我使用了一个单独的类来保存我的表单值。使用该类,我获得了所需的参数。这现在工作正常。