PIMPL(Private Implementation 或 Pointer to Implementation)是通過一個私有的成員指針,將指針所指向的類的內部實現數據進行隱藏。
PIMPL基於這樣一個事實:在C++類中,允許定義一個成員指針,指向一個已聲明過的類型。在頭文件中只是存放該類型的聲明,而具體的定義是存放在CPP文件中,這樣就可以隱藏類型的具體實現。
該chapter與講解unique_ptr的chapter息息相關: https://blog.csdn.net/qq_35865125/article/details/103752348
---------------comment: 對於incomplete type,可以用來聲明指針或者引用,不能使用其進行實例化。
---用std::unique_ptr來代替裸指針:
--上面這樣使用std::unique_ptr可能會出現的編譯錯誤: 上面的代碼沒有爲Widget類實現析構函數,因此編譯器會自動
生成一個默認的析構函數,析構函數會調用widget類的各個成員變量的析構函數,當調用成員std::unique_ptr<Impl>的
析構函數時報錯了,該成員的析構函數就是unique_ptr類的析構函數,其會對其包裹的指針進行delete, 下文中提到,在delete
之前c++會對將要被delete的指針進行檢查,看其是否是不完整類型,於是乎,就是在這一步出錯了。我認爲可能是編譯器自動
生成的析構函數在頭文件裏面,看不到Impl結構的定義,所以報錯,下下文提到的解決辦法也是用戶去自己在cpp中顯示地定義析構函數::
解決編譯錯誤:
ongoing------
Ref:
https://blog.csdn.net/wo17fang/article/details/25280577