6 頭文件依賴,Pimpl法,加速編譯
???舉個例子:
??????// File: SoundSystem.h
??????#include "StreamFilter.h"
??????#include "Emitters."
??????class SoundSystem {
??????public:
?????????// ...
??????private:
?????????StreamFilter?currentFilter;
?????????EmitModeConfig modeConfig;
??????};
???一目了然的是,看得出SoundSystem實現使用了StreamFilter和EmitModeConfig的定義,所以#include 了他們的定義在此SoundSystem.h中,可是隨著項目的不斷推進,class SoundSystem中依賴的使用類型會增多,它的header被引入到其它模塊中,不知不覺的編譯時間越來越長,改進之:
??????// File: SoundSystem.h
??????class StreamFilter;
??????class EmitModeConfig;
??????class SoundSystem {
??????public:
?????????// ...
??????private:
?????????StreamFilter*?currentFilterPtr;
?????????EmitModeConfig* modeConfigPtr;
??????};
??????// File: SoundSystem.cpp
??????#include "StreamFilter.h"
??????#include "Emitters."
??????SoundSystem::SoundSystem() {
?????????//...
?????????currentFilterPtr = new StreamFilter;
?????????modeConfigPtr = new EmitModeConfig;
??????}
??????SoundSystem::~SoundSystem() {
?????????delete currentFilterPtr;
?????????delete modeConfigPtr;
?????????//...
??????}
??????這么一來,把StreamFilter和EmitModeConfig的#include藏到了SoundSystem的實現代碼中,以后對SoundSystem的部分改動不會導致其它模塊的rebuild哦,不過由此可能會犧牲一點效率吧!
??????記得,有位微軟的C++翹楚人物,Herb Sutter給這種技巧稱為Pimpl ( Private Implemention ), 用的恰到好處時,可以提高項目開發速度,同時模塊的頭文件間的#include關系得以緩解,可以避開循環依賴,而且可以獲得一個良好的物理設計。
( to be continued )