1. 程式人生 > >強耦合和解耦合的一種情況-pimpl

強耦合和解耦合的一種情況-pimpl

//x.hpp
class X
{
public:
   void getX(){...}
}

//c.h
#include <x.hpp>
class C
{
public:
   void getC();
private:
   X x;
}

//c.cpp
#include <c.h>
void C::getC()
{
   x.getX();
   ...
}

//s.h
#include <c.h>
class S
{
private:
   C c;
}
上面所寫的程式碼中包含三個類X、C和S,其中C類中包含X的例項,S類中包含C類的例項。 X類的任意改動,都將帶來所有檔案的重新編譯。 原因是,C類當中使用X類 X x; 將先使用malloc(sizeof(X))分配空間,然後呼叫X的無引數的建構函式。而X的任意變動可能導致X的大小的改變,所以C類的檔案必須重新編譯。依此類推,S類的檔案也將重新編譯。 這樣無疑是很浪費時間的。而發生以上現象的本質原因是什麼?本質是幾個類是強耦合的。所以解決這個問題就在於怎麼解耦合了。我們解耦合要達到的目的就是,X類的改變不會導致S類檔案的重新編譯,由於C類檔案使用了X類的介面,所以C類檔案的改變是正常的。 改變的方法是:
//c.h
class X;    //此處不包含標頭檔案,只使用前導宣告
class C
{
public:
   void getC();
private:
   X *x;    //使用指標
}

//c.cpp 
#include <c.h>
#include <x.hpp>   //改在此處包含標頭檔案
C類中使用的是X類的指標,而指標的大小固定是8位元組(32位系統),這樣X類的改變不會導致包含c.h檔案的檔案的重新編譯。 至此我們解耦合了。這就是pimpl設計模式。