隐藏实现,有时候被人称为“语法糖”,其实它还是有用处的!!!
1. 隐藏实现的例子
// A.h
class A
{
};
// B.h
#include "A.h"
class B
{
private:
int m_value;
A m_a; // 这里,其实一般用指针,再在前面加个前置声明。但这里为了举例子,这么声明,有时候针对模板/第三方库的话,就得这么声明。
};
上面就是一般的声明,我们知道m_value, m_a是private,没必要暴露在头文件,这就有了隐藏实现的做法:
// B.h
class BPrivate
class B
{
private:
BPrivate* d;
};
// B.cpp
#include "B.h"
#include "A.h"
class BPrivate
{
public:
int value;
A a;
};
隐藏实现,大概就是上面这么个样子。咋看上去,是多此一举,有点“语法糖”的味道。
其实不然,还是有用处的:
比如,我们需要把上述的程序进行打包成so(动态链接库),并且暴露B的接口。这样,后面的B.h就更轻便,因为它去除了对A.h的依赖。而前面的B.h,就比较重,它还需依赖于A.h,而且A.h也有可能依赖于别的库。
故隐藏实现,有时候还是得派上用场的。
当然,并不是每个class都需隐藏实现,这得看情况。
此外,隐藏实现,还有一个很重要的用途是进行二进制代码的兼容(及更新so,而无需重新编译依赖该so的应用程序;关于这点,微软的COM做的比较优秀),这点没有具体细究。