相信有不少人有這種經驗:如果所處理的是一個非常大型的專案,常常更改一些小東西就要等個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。