好的,我理解前向声明,但在这种情况下我需要在两端调用成员/字段,所以我无法使用它。我试图覆盖.cpp文件中的声明(通过包含我需要使用的类的实际头部),但是当我尝试使用它时,我通过前向声明在头文件中定义的指针被打破了。
我该如何解决这个问题?你需要代码吗?
答案 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;
};
这是一个不好的做法,但如果你需要一个直接的解决方案,它就足够了。更好的方法是修复依赖项或使用单独的基类。