类定义的相互依赖与前向声明
A1与A2直接依赖,可能还会存在间接依赖,这些在程序中应该尽可能避免这种设计,而是引入一个新类,让A1和A2都依赖这个新类。
// a1.h
class A1
{
public:
A2* mpa2;
}
// a2.h
class A2
{
public:
A1* mpa1;
}
如果已经存在这种依赖关系,那么可以通过前向声明
来解决问题。
类的前向声明并不是类的完整定义,有些情况下,必须要类的完整定义而并不是类的前向声明。比如
- 在类A1中声明A2的对象
- 在类A1的定义中需要知道A2类型对象的大小
- 在类A1的定义中需要调用A2的类成员函数
// a1.h
class A2; // 类A2的前向声明
class A1
{
public:
A2* mpa2;
void a2func() {};
}
// a2.h
class A1;
class A2
{
public:
A1* mpa1; // 不会报错
A1 a2obj; // 编译错误
void size_value = sizeof(A1); // 编译错误
mpa1 -> a1func(); // 编译错误
}
或者不要前向声明,但是只能在一个.h文件中include另一个.h文件,可以保证引用.h的这个文件不会报错,就是比较奇怪。
// a1.h
class A2; // 类A2的前向声明
class A1
{
public:
A2* mpa2;
void a2func() {};
}
// a2.h
#include "a1.h"
// class A1; // 这时候就不用前向声明了。
class A2
{
public:
A1* mpa1; // 不会报错
A1 a2obj; // 编译错误
void size_value = sizeof(A1); // 编译错误
mpa1 -> a1func(); // 编译错误
}