再说说libjingle这个库,看了N久了,还是没搞清楚流程。但是从libjingle的源码中学到了PIMPL的知识。
假设现在有一个StuManager类,
StuManager.h
classStuManager
{
public:
constint getAge() const;
private:
intage;
std::stringname;
};
如果现在需要添加一个std::string StuManager::school属性,那么悲剧可能开始了,如果有太多的模块间接或直接依赖于StuManager.h文件,当这些模块侦测(makefile/config)到StuManager变化时,均需要重新编译obj,如果需要重新编译的模块太多,那编译的时间就太长了。
此时有一种好的解决方案,将实现私有化PIMPL。
StuManager.h
classStuManager
{
public:
StuManager();
~StuManager();
constint getAge() const;
private:
structStuData;
std::auto_ptr<StuData>pStu; //PIMPL
};
StuManager.cpp
structStuManager::StuData
{
intage;
std::stringname;
std::stringschool;
};
StuManager::StuManager(void):pStu(newStuData()){}
constint StuManager::getAge() const
{
returnpStu->age;
}
此时只要StuManager类提供的公有接口不变,那么重新编译时只需编译StuManager.obj。
所以,PIMPL是一种降低文件编译依赖度,减少模块间耦合度的好方法。