循环依赖?

时间:2013-11-25 22:58:00

标签: c++ dependencies

好的,我理解前向声明,但在这种情况下我需要在两端调用成员/字段,所以我无法使用它。我试图覆盖.cpp文件中的声明(通过包含我需要使用的类的实际头部),但是当我尝试使用它时,我通过前向声明在头文件中定义的指针被打破了。

我该如何解决这个问题?你需要代码吗?

2 个答案:

答案 0 :(得分:3)

您需要记住,形成指向类的指针只需要该类的声明,而访问该类的成员则需要其定义。所以要解决循环依赖,你可以这样做:

<强> A.hpp

class B;

class A
{
public:
  int foo(B *b);
  int bar();
};

<强> B.hpp

class A;

class B
{
  A *m_a;
public:
  int foo();
  explicit B(A *a) : m_a(a) {}
};

<强> A.cpp

#include "A.hpp"
#include "B.hpp"

int A::foo(B *b)
{
  return 2 * b->foo();
}

int A::bar()
{
  return 42;
}

<强> B.cpp

#include "A.hpp"
#include "B.hpp"

int B::foo()
{
  return m_a->bar();
}

答案 1 :(得分:0)

如果您是唯一可以访问代码内部的人(例如,当您为自己做项目时,单独或分发已关闭的 .lib / .dll ),你肯定你需要你的课程以循环方式包含自己,你总是可以使用抽象基类。

class base{};

class A: public base{
   base *bMember;
};

class B: public base{
   base *aMember;
};

这是一个不好的做法,但如果你需要一个直接的解决方案,它就足够了。更好的方法是修复依赖项或使用单独的基类。