所以我有一个 A 类,我想在其中调用一些 B 类函数。所以我包括“bh”。但是,在 B 类中,我想调用 A 类函数。如果我包含“啊”,它会以无限循环结束,对吗?我能做些什么呢?
4 回答
仅将成员函数声明放在头文件 (.h) 中,并将成员函数定义放在实现 (.cpp) 文件中。然后你的头文件不需要相互包含,你可以在任一实现文件中包含两个头文件。
对于还需要在成员签名中引用其他类的情况,可以使用前向声明:
class A;
这使您可以使用指针和引用类型(A*
和A&
),但不能A
使用它本身。它也不允许您呼叫成员。
例子:
// a.h
struct B; // forward declaration
struct A {
void foo(B* b); // pointers and references to forward-declared classes are ok
};
// b.h
struct A; // forward declaration
struct B {
void bar(A& a); // pointers and references to forward-declared classes are ok
};
// a.cpp
#include "a.h"
#include "b.h"
void A::foo(B* b) {
b->bar(*this); // full declaration of B visible, ok to call members now
}
// b.cpp
#include "a.h"
#include "b.h"
void B::bar(A& a) {
a.foo(this); // full declaration of A visible, ok to call members now
}
每个类(A 和 B)都应该有一个头文件和一个实现文件。
每个头文件(例如A.h
)不应包含其他头文件(例如B.h
),但可能包含对其他类的前向引用(例如,类似的语句class B;
),然后可以在其声明中使用指向其他类的指针和/或引用(例如,class A
可以包含 aB*
作为数据成员和/或作为方法参数)。
每个 CPP 文件(例如A.cpp
)可以包括一个以上的头文件(例如A.h
和B.h
)。建议每个 CPP 文件应该首先包含它自己的头文件(例如A.cpp
应该包含A.h
然后B.h
,而B.cpp
应该包含B.h
然后然后A.h
)。
每个头文件应该只包含声明,而不是类的定义:例如,它将列出类方法的签名,但不包含方法体/实现(方法体/实现将在.cpp
文件中,而不是在头文件中)。由于头文件不包含实现细节,因此它们不依赖(不需要查看)其他类的细节;他们最多需要知道,例如,B
是一个类的名称:它可以从前向声明中获得,而不是通过在另一个头文件中包含一个头文件。
您还可以使用前向声明来解决此问题。
尝试将#ifndef
, #define
and放在#endif
您的 .h 文件周围。