所以我有一个A类,我想调用一些B类函数。所以我包括“b.h”。但是,在B类中,我想调用一个A类函数。如果我包含“a.h”,它会以无限循环结束,对吧?我该怎么办呢?
答案 0 :(得分:36)
只将成员函数声明放在头文件(.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
}
答案 1 :(得分:27)
每个类(A和B)都应该有一个头文件和一个实现文件。
每个头文件(例如A.h
)不应包含其他头文件(例如B.h
),但可以包含对另一个类的前向引用(例如class B;
之类的语句) ,然后可以在其声明中使用指针和/或对其他类的引用(例如class A
可能包含B*
作为数据成员和/或作为方法参数。)
每个CPP文件(例如A.cpp
)可以包括多个头文件(例如A.h
和B.h
)。建议每个CPP文件首先应包含自己的头文件(例如A.cpp
应包括A.h
然后B.h
,而B.cpp
应包含B.h
然后A.h
)。
每个头文件应该只包含声明,而不是类的定义:例如,它将列出类'方法的签名,但不包括方法体/实现(方法体/实现将在.cpp
文件,不在头文件中)。因为头文件不包含实现细节,所以它们不依赖于(不需要查看)其他类的细节;至多他们需要知道,例如,B
是类的名称:它可以从前向声明中获取,而不是在另一个头文件中包含头文件。
答案 2 :(得分:9)
您还可以使用forward declarations来解决此问题。
答案 3 :(得分:-7)
尝试在您的.h文件周围放置#ifndef
,#define
和#endif
。