close

大家好,今天介紹一個C++中非常常用的模式:pimpl

至於它有什麼作用,直接看代碼:

// MyClass.hclass MyClass {public: void func1(); void func2();private: void func3(); void func4(); int a; int b;};

假設我們在開發一個SDK,或者設計某個模塊,需要暴露出去一個MyClass.h頭文件,並向用戶提供func1和func2兩個功能。

但是MyClass中還有一些private函數和字段,這些函數和字段我們本意可能是不想被用戶知道,因為可能裡面有些隱私內容,用戶有可能通過這些private方法和字段就能猜到我們的架構及實現。

這也是我們平時設計模塊需要注意的一點:只暴露出該暴露的東西。

那怎麼做呢?答案就是pimpl模式。

可以這樣:

// MyClass.hclass MyClass {public: void func1(); void func2();private: class impl; impl* pimpl;};// MyClass.ccclass MyClass::impl {public: void func1(); void func2();private: void func3(); void func4(); int a; int b;};MyClass::MyClass() { pimpl = new impl;}void MyClass::func1() { pimpl->func1();}

將類的private屬性隱藏進一個內部類,然後通過一個指針訪問(提前聲明)它的接口。在頭文件中只暴露出應該暴露的功能,然後持有一個Impl的指針,而Impl則具體在MyClass.cc中定義,用戶什麼都看不到。然後所有的功能都通過Impl完成。頭文件里的Impl的指針也可以通過智能指針(unique_ptr)來代替,但這不是本文的重點。

再總結一下pimpl模式的優點:

非常適合隱藏private實現:如果想要在頭文件中暴露public接口,但又不想暴露private實現的細節,則可以使用pimpl模式來隱藏細節。

pimpl模式也被稱為編譯防火牆,是一種用來減少編譯時間的方法。通常來講,如果頭文件里的某些內容變更了,意味着所有引用該頭文件的代碼都要被重新編譯,即使變更的是無法被用戶類訪問的私有成員。將這部分代碼從被引用多次的頭文件里移除到只被引用編譯一次的源文件中,更改此文件就不會付出太長的編譯時間。

大家怎麼看?

參考資料

https://en.cppreference.com/w/cpp/language/pimpl


往期推薦



研究了一下Android JNI,有幾個知識點不太懂。

60 張圖詳解 98 個常見網絡概念

哪家互聯網公司一周工作時間最長??太卷了!!!

沒辦法,基因決定的!

C++的lambda是函數還是對象?

深入理解glibc malloc:內存分配器實現原理

到底什麼是掛載?

C/C++為什麼要專門設計個do…while?

為什麼空類大小是1

推薦一個學習技術的好網站

在部隊當程序員有多爽?

Linux最大並發數是多少?

累夠嗆!整理了一份C++學習路線圖!

C++ protected繼承和private繼承是不是沒用的廢物?

圖解|工作6年多,我還是沒有搞懂什麼是協程的道與術

研究了一波Android Native C++內存泄漏的調試

參加了 40 多場面試。

如何調試內存泄漏?方法論來了

寫了一段「高端」C語言代碼

點個在看你最好看


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()