circuler dependancies VC++
我已经创建了一个名为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;
}
你似乎混淆源文件的概念,包含文件。
简单地解释,在++有两种类型的文件C:
- 源文件包含的源代码。这是将在您的应用程序中执行的代码。源文件通常具有扩展名.CPP。
- 包含文件包含声明。它们只描述应用程序中的元素,但不包含源代码。包含文件通常具有扩展名.H。
源文件可以包含包含文件,包含文件可以包含其他包含文件。源文件从不包含在其他文件中。它们被编译并链接在一起。
对你而言,在form1.h中包含“Extending.cpp”显然是不正确的。
尝试将代码拆分为清晰的包含文件和源文件。这意味着:它包含表单类
- 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使用。
thnx为您的答案,但这仍然困惑我可以看看@我的答案。 – Mafas 2011-02-03 04:02:37
我已经使用MVC模式做到了这一点。我从视图中分离出模型。我使用了一个单独的类来保存我的表单值。使用该类,我获得了所需的参数。这现在工作正常。
你为什么`#include`-ING .cpp文件? – robert 2011-02-02 16:53:06