我已经创建了一个名为windowstestapp的Windows窗体应用程序。然后,我创建了一个名为EXTENDING.CPP的类,其中添加了一个名为add()的函数,该函数从form1类创建一个对象,并获取用于计算的TextBox值。当我试图在form1类中创建扩展对象的实例时,问题就出现了;这不允许我创建对象。
我认为问题出在双向依赖中。有人能帮我吗?
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;
}发布于 2011-02-03 05:33:13
您似乎混淆了源文件和包含文件的概念。
简单地说,在C++中有两种类型的文件:
源文件可以包含包含文件,而包含文件可以包含其他包含文件。源文件从不包含在其他文件中。它们被编译并链接在一起。
在您的例子中,在form1.h中包含"Extending.cpp“显然是不正确的。
试着把你的代码分成清晰的包含文件和源文件。这意味着:
的源代码
您将注意到FORM1.H将不需要EXTENDING.H,反之亦然。
另一方面,FORM1.CPP可能需要FORM1.H和EXTENDING.H,EXTENDING.CPP可能需要FORM1.H和EXTENDING.H,但这不是问题。
现在编译这两个CPP文件并将它们链接在一起。
一旦您获得了更多使用C++的经验,您将看到确实可以将源代码放在包含文件中(以使内联成为可能),并具有循环依赖项(使用向前声明),但首先要开始获得更多使用C++的经验。
编辑:
如果Form1中存在需要扩展的内容,则可能是以下情况之一:
中有一个成员,它是指向扩展类的指针-->使用正向声明(编译器实际上不需要知道类的完整定义就能生成存储指针的代码)
中包含EXTENDING.H
反之亦然。
如果您仍然具有循环依赖关系,请取出导致该依赖关系的成员,并将它们放入不同的类中,然后EXTENDING.H和FORM1.H都可以使用该类。
发布于 2011-02-10 23:10:39
我已经使用MVC模式做到了这一点。我将模型从视图中分离出来。我使用了一个单独的类来保存我的表单值。使用这个类,我获得了请求的参数。现在可以正常工作了。
https://stackoverflow.com/questions/4877217
复制相似问题