至于它有什么作用,直接看代碼:
// 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文章
2117瀏覽量
74787 -
SDK
+關注
關注
3文章
1066瀏覽量
47715 -
頭文件
+關注
關注
0文章
26瀏覽量
10033 -
func
+關注
關注
0文章
2瀏覽量
1086
發布評論請先 登錄
開發板里的CPLD原程序,一般廠商是不提供的,內部資料,非常有用
對新手非常有用的電子器件基礎資料
MPLAB Harmony C++怎么使用
CodeWarrior C and C++ and Assembly 語言參考設計
Vim中默認未啟用但實際非常有用的選項
C++語言的基本構成詳細資料說明

17個非常有用的Python技巧
一個簡單但非常有用的小前置放大器電路

沒有什么是完美的,但FPGA可能非常有用

評論