強耦合和解耦合的一種情況-pimpl
阿新 • • 發佈:2019-01-09
//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類中使用的是X類的指標,而指標的大小固定是8位元組(32位系統),這樣X類的改變不會導致包含c.h檔案的檔案的重新編譯。 至此我們解耦合了。這就是pimpl設計模式。//c.h class X; //此處不包含標頭檔案,只使用前導宣告 class C { public: void getC(); private: X *x; //使用指標 } //c.cpp #include <c.h> #include <x.hpp> //改在此處包含標頭檔案