21

所以我有一个 A 类,我想在其中调用一些 B 类函数。所以我包括“bh”。但是,在 B 类中,我想调用 A 类函数。如果我包含“啊”,它会以无限循环结束,对吗?我能做些什么呢?

4

4 回答 4

38

仅将成员函数声明放在头文件 (.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
}
于 2009-12-03T01:51:20.053 回答
29

每个类(A 和 B)都应该有一个头文件和一个实现文件。

每个头文件(例如A.h)不应包含其他头文件(例如B.h),但可能包含对其他类的前向引用(例如,类似的语句class B;),然后可以在其声明中使用指向其他类的指针和/或引用(例如,class A可以包含 aB*作为数据成员和/或作为方法参数)。

每个 CPP 文件(例如A.cpp)可以包括一个以上的头文件(例如A.hB.h)。建议每个 CPP 文件应该首先包含它自己的头文件(例如A.cpp应该包含A.h然​​后B.h,而B.cpp应该包含B.h然​​后然后A.h)。

每个头文件应该只包含声明,而不是类的定义:例如,它将列出类方法的签名,但不包含方法体/实现(方法体/实现将在.cpp文件中,而不是在头文件中)。由于头文件不包含实现细节,因此它们不依赖(不需要查看)其他类的细节;他们最多需要知道,例如,B是一个类的名称:它可以从前向声明中获得,而不是通过在另一个头文件中包含一个头文件。

于 2009-12-03T02:00:38.227 回答
10

您还可以使用前向声明来解决此问题。

于 2009-12-03T01:57:00.323 回答
-7

尝试将#ifndef, #defineand放在#endif您的 .h 文件周围。

于 2010-04-20T07:51:52.770 回答