至于它有什么作用,直接看代碼:
// MyClass.h
class 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.h
class MyClass {
public:
void func1();
void func2();
private:
class impl;
impl* pimpl;
};
// MyClass.cc
class 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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C++
+關注
關注
22文章
2124瀏覽量
77120 -
SDK
+關注
關注
3文章
1101瀏覽量
51730 -
頭文件
+關注
關注
0文章
26瀏覽量
10322 -
func
+關注
關注
0文章
2瀏覽量
1144
發布評論請先 登錄
相關推薦
熱點推薦
開發板里的CPLD原程序,一般廠商是不提供的,內部資料,非常有用
本帖最后由 assingle 于 2011-2-18 14:03 編輯
開發板里的CPLD內部邏輯原理,一般廠商是不提供的,內部資料,非常有用,希望能給大家有參考作用,開發環境QUARTUS II 6.0,CPLD為EPM240T100C5N,超便宜,比EPM712
發表于 02-18 14:02
對新手非常有用的電子器件基礎資料
本帖最后由 eehome 于 2013-1-5 09:56 編輯
對新手非常有用的電子器件基礎資料PCB打樣找華強 http://www.hqpcb.com/3 樣板2天出貨
發表于 10-20 20:13
MPLAB Harmony C++怎么使用
MPLAB和諧文檔(在什么是MPLAB和諧?)“MPLA-和聲沒有用C++測試過,因此,沒有提供對這個編程語言的支持。”——對于2018來說非常令人難以置信。有人成功地使用C++和和聲
發表于 09-20 09:40
CodeWarrior C and C++ and Assembly 語言參考設計
本文是英文版的,介紹了CodeWarrior C and C++ and Assembly 語言參考設計,在您的設計中或許有用:
發表于 06-22 15:33
?74次下載
Vim中默認未啟用但實際非常有用的選項
Vim 作為一款功能強大、選項豐富的編輯器,為許多用戶所熱愛。本文介紹了一些在 Vim 中默認未啟用但實際非常有用的選項。雖然可以在每個 Vim 會話中單獨啟用,但為了創建一個開箱即用的高效編輯環境,還是建議在 Vim 的配置文件中配置這些命令。
C++語言的基本構成詳細資料說明
C++語言中的數據類型、運算、語句結構、數組、指針、函數是C++程序設計的基礎。掌握這些基本內容,對利用C++語言解決一般應用問題是非常必要和有用
發表于 02-19 14:49
?0次下載
17個非常有用的Python技巧
Python 是一門非常優美的語言,其簡潔易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 帶我們回顧了 17 個非常有用的 Python 技巧,例如查找、分割和合并列表等。這 17 個技巧都非常簡單
一個簡單但非常有用的小前置放大器電路
一個簡單但非常有用的小前置放大器電路可以通過連接幾個晶體管來構建。該裝置可輕松將 1mV 信號提升至 100mV 甚至更高。因此,它非常方便放大不能直接與功率放大器一起使用的極小信號。
沒有什么是完美的,但FPGA可能非常有用
FPGA是非常有用的器件,通常與ADI公司的ADC或功率IC等一起設計到客戶的設計中。FPGA 可以實現微控制器和所需的任何膠水邏輯。在這篇博客中,我將討論一些與功能安全和FPGA相關的問題。
c++多行注釋快捷鍵
在C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個語句的方法。當你希望暫時禁用一些代碼或者解釋特定部分代碼的作用時,多行注釋是非常有用的。 在C++中,多行注釋以 /* 開始,以
C++中非常有用的設計模式
評論