为什么前向声明不能解决循环依赖?

时间:2011-02-06 02:57:32

标签: c++ compiler-errors circular-dependency

我有三个类:一个TopClass,它包含一个BottomClass指针的实例。 BottomClass包含指向HelperClass的指针。 HelperClass保留指向TopClass的指针。弹出循环依赖关系,HelperClass中需要转发声明。

以下代码片段说明了所有这些:

#include "BottomLevel.h"

namespace foo
{
  class TopLevel
  {
  private:
    BottomLevel* item;
  };
}

-

#include "HelperClass.h"

namespace foo
{
  class BottomLevel
  {
  private:
    HelperClass* item;
  };
}

-

class TopLevel; // forward declaration here

namespace foo
{
  class HelperClass
  {
  public
    HelperClass(TopLevel* item);
  };
}

尝试在实现文件中执行操作时会出现问题。如果我在cpp文件中#include "TopClass.h",则会收到编译错误,指出“未找到重载的成员函数 - 使用未定义的类型'TopLevel'”(错误C2511和C2027)。

然后,如果我不执行#include我仍然留下C2027错误,因为我尝试使用前向声明的类型。

我只知道有一种方法可以解决这个问题,我确信我之前已经做过了,但我不能为我的生活记住我应该做的事情。有什么帮助吗?

2 个答案:

答案 0 :(得分:6)

问题在于您在TopLevel命名空间之外声明foo,因此编译器永远不会找到类foo::TopLevel

尝试在TopLevel命名空间内移动foo的前向声明。

答案 1 :(得分:0)

您需要表单的正向声明

namespace foo {
class TopLevel;
class BottomLevel;
class HelperClass;
}

然后顺序不重要[因为你使用指针]