我有两个标题,A和B.它们看起来像这样:
// A.h
#include "B.h";
class A {
// stuff
AFunction(B* b);
OtherFunction();
}
// B.h
class A;
BFunction(A* a);
这是我第一次尝试解决循环依赖,所以我不确定我在做什么。我的问题如下:在某些时候,功能调用a->OtherFunction();
。我得到一个错误,因为OtherFunction没有向前声明,我也不能转发声明它,显然。情况是对称的(AFunction调用b-> SomeOtherFunction()),所以我无法通过交换包含和转发声明来修复它。
我该如何解决这个问题?
答案 0 :(得分:1)
如果您需要关于A或B的任何内容,而不只是指定其类型的指针,那么您必须将相关代码移动到.cpp文件中,因为您不能将它们包含在循环中办法。解决方案如下:
<强> A.H 强>
class B; // forward declaration
class A {
B* b;
// legal, you don't need to know anything about B
void set(B* b) { this->b = b; }
// must be implemented in .cpp because it needs to know B
void doSomethingWithB();
};
<强> A.cpp 强>
#include "A.h"
#include "A.h"
void A::doSomethingWithB() {
b->whatever();
<强> B.h 强>
class A
class B {
void methodWithA(A* a);
};
<强> B.cpp 强>
#include "B.h"
#include "A.h"
void B::methodWithA(A* a) {
a->whatever();
}
答案 1 :(得分:0)
两个.cpp文件都应包含.h文件。
简化示例:
// A.h
void funcA();
// A.c
#include "A.h"
#include "B.h"
void funcA() { funcB(); }
// B.h
void funcB();
// B.c
#include "A.h"
#include "B.h"
void funcB() { funcA(); }
请记住,除非您正在处理模板化类,声明进入头文件,定义(实现)进入源文件。
答案 2 :(得分:0)
只要您在类定义中仅使用指针,就可以在.h文件中的每个类前面声明另一个类,然后< strong>在.cpp文件中包含.h 文件。
将.h文件中类的定义中的任何代码移动到 .cpp 中函数的定义,以减少任何依赖关系。即使用.cpp文件中的其他类详细信息定义所有函数。
答案 3 :(得分:0)
从成员函数A::OtherFunction()
更改为独立函数OtherFunction(A*)
。