相信有不少人有這種經驗:如果所處理的是一個非常大型的專案,常常更改一些小東西就要等個10幾20分的編譯時間。那麼我們該怎麼處理這個問題呢?
以下內容見exceptional c++ item26 ~ item 28:
// file x.h class X { // public and protected members private: struct XImpl;// a pointer to a forward-declared class XImpl* pimpl_; // a pointer to a forward-declared class }; // file x.cpp struct X::XImpl { // private members; fully hidden, can be // changed at will without recompiling clients };
使用這種方法,可以減少header更動時,相關的cpp檔必須重新編譯的時間。此技巧稱為pimpl idiom。
一個對良好的header檔,對其所依賴的其他h檔應該越少越好,具體作法如下:
// x.h: after removing unnecessary inheritance // #include <iosfwd> #include "a.h" // class A class B; class C; class E; class X : public A { public: X( const C& ); B f( int, char* ); C f( int, C ); C& g( B ); E h( E ); virtual std::ostream& print( std::ostream& ) const; private: struct XImpl; XImpl* pimpl_; }; inline std::ostream& operator<<( std::ostream& os, const X& x ) { return x.print(os); }
其中BCE由於只有在方法參數及return中出現,由於不會影響到該class的大小(二進制布局),因此不需要去include該header,而只要在前面宣告:
class B;
class C;
class E;
即可,另外由於其private member已經用pimpl idom的方法將其從介面中隔絕了,因此我們所設計的這個X class的header檔就可以變的非常的精簡,而大部份參與實作的檔案都被隔絕到cpp檔中才include。
Leave a Reply