循环依赖VC ++

时间:2011-02-02 16:46:42

标签: visual-c++

我创建了一个名为windowstestapp的Windows表单应用程序。然后我创建了一个类调用EXTENDING.CPP,其中我添加了一个函数调用add(),它从form1类创建一个对象并获取计算的文本框值。 当我试图在form1类中创建EXTENDING对象的实例时出现问题;这不允许我创建一个对象。

我认为问题出在双向依赖关系中。任何人都可以帮助我吗?

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;
}

2 个答案:

答案 0 :(得分:1)

您似乎混淆了源文件和包含文件的概念。

简单地说,在C ++中,您有两种类型的文件:

  • 源文件包含源代码。这是将在您的应用程序中执行的代码。源文件通常具有扩展名.CPP。
  • 包含文件包含声明。它们仅描述应用程序中的元素,但不包含源代码。包含文件通常具有扩展名.H。

源文件可以包含包含文件,包含文件可以包含其他包含文件。源文件永远不会包含在其他文件中。它们被编译并链接在一起。

在您的情况下,form1.h中包含“Extending.cpp”显然不正确。

尝试将代码拆分为明确的包含文件和源文件。这意味着:

  • FORM1.H,其中包含类声明,但没有源代码
  • FORM1.CPP,其中包含表单类的代码
  • EXTENDING.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,则可能是以下情况之一:

  • 您有一个需要定义扩展类的内联方法 - >将方法移动到form1.cpp。
  • 您在Form1中有一个成员,它是指向扩展类的指针 - >使用前向声明(编译器实际上不需要知道类的完整定义,以便能够生成用于存储指针的代码)
  • 您在Form1中有一个成员,它是一个扩展实例 - >那么你真的需要在FORM1.H
  • 中加入EXTENDING.H
  • 您的Form1类继承自Extending - >那么你真的需要在FORM1.H
  • 中加入EXTENDING.H
  • Form1中有一种数据类型需要在Extending中定义某些内容(可能是枚举) - >那么你真的需要在FORM1.H
  • 中加入EXTENDING.H

相反检查相同的方法。

如果您仍然具有循环依赖关系,请拉出导致依赖关系的成员并将它们放在另一个类中,然后EXTENDING.H和FORM1.H可以使用它们。

答案 1 :(得分:0)

我使用MVC模式完成了这项工作。我将模型与视图分开。我使用了一个单独的类来保存我的表单值。使用该类,我获得了所请求的参数。现在效果很好。