Asj*_*Asj 21 c++ class include forward-declaration
所以我有一个A类,我想调用一些B类函数.所以我加上"bh".但是,在B类中,我想调用一个A类函数.如果我包含"啊",它会以无限循环结束,对吧?我能做些什么呢?
Pav*_*aev 37
仅将成员函数声明放在头文件(.h)中,并将成员函数定义放在实现(.cpp)文件中.然后您的头文件不需要包含彼此,并且您可以在任一实现文件中包含两个头文件.
对于需要在成员签名中引用其他类的情况,您可以使用前向声明:
class A;
Run Code Online (Sandbox Code Playgroud)
这允许您使用指针和引用类型(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
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*isW 28
每个类(A和B)应该有一个头文件和一个实现文件.
每个头文件(例如A.h)不应该包括其他头文件(例如B.h),但可以包括对另一个类的前向引用(例如类似的语句class B;),然后可以在其声明中使用指针和/或对其他类的引用(例如,class A可以包含a B*作为数据成员和/或作为方法参数).
每个CPP文件(例如A.cpp)可以包括多于一个头文件(例如A.h和B.h).建议每个CPP文件首先应包含自己的头文件(例如,A.cpp应包括A.h然后B.h,然后B.cpp应包括B.h然后A.h).
每个头文件应该只包含声明,而不是类的定义:例如,它将列出类的方法的签名,但不列出方法体/实现(方法体/实现将在.cpp文件中,而不是在头文件中).因为头文件不包含实现细节,所以它们不依赖于(不需要查看)其他类的细节; 例如,他们最多需要知道B一个类的名称:它可以从前向声明中获取,而不是通过在另一个头文件中包含头文件.