0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中非常有用的設(shè)計(jì)模式

汽車電子技術(shù) ? 來源:程序喵大人 ? 作者:程序喵大人 ? 2023-02-21 14:21 ? 次閱讀

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

至于它有什么作用,直接看代碼:

// MyClass.h


class MyClass {
public:
    void func1();
    void func2();


private:
    void func3();
    void func4();


    int a;
    int b;
};

假設(shè)我們在開發(fā)一個(gè)SDK,或者設(shè)計(jì)某個(gè)模塊,需要暴露出去一個(gè)MyClass.h頭文件,并向用戶提供func1和func2兩個(gè)功能。

但是MyClass中還有一些private函數(shù)和字段,這些函數(shù)和字段我們本意可能是不想被用戶知道,因?yàn)榭赡芾锩嬗行╇[私內(nèi)容,用戶有可能通過這些private方法和字段就能猜到我們的架構(gòu)及實(shí)現(xiàn)。

這也是我們平時(shí)設(shè)計(jì)模塊需要注意的一點(diǎn):只暴露出該暴露的東西。

那怎么做呢?答案就是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屬性隱藏進(jìn)一個(gè)內(nèi)部類,然后通過一個(gè)指針訪問(提前聲明)它的接口。在頭文件中只暴露出應(yīng)該暴露的功能,然后持有一個(gè)Impl的指針,而Impl則具體在MyClass.cc中定義,用戶什么都看不到。然后所有的功能都通過Impl完成。頭文件里的Impl的指針也可以通過智能指針(unique_ptr)來代替,但這不是本文的重點(diǎn)。

再總結(jié)一下pimpl模式的優(yōu)點(diǎn):

  • 非常適合隱藏private實(shí)現(xiàn):如果想要在頭文件中暴露public接口,但又不想暴露private實(shí)現(xiàn)的細(xì)節(jié),則可以使用pimpl模式來隱藏細(xì)節(jié)。
  • pimpl模式也被稱為編譯防火墻,是一種用來減少編譯時(shí)間的方法。通常來講,如果頭文件里的某些內(nèi)容變更了,意味著所有引用該頭文件的代碼都要被重新編譯,即使變更的是無法被用戶類訪問的私有成員。將這部分代碼從被引用多次的頭文件里移除到只被引用編譯一次的源文件中,更改此文件就不會(huì)付出太長的編譯時(shí)間。

大家怎么看?

參考資料

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1006

    瀏覽量

    45415
  • 頭文件
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    9817
  • func
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1023
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開發(fā)板里的CPLD原程序,一般廠商是不提供的,內(nèi)部資料,非常有用

    本帖最后由 assingle 于 2011-2-18 14:03 編輯 開發(fā)板里的CPLD內(nèi)部邏輯原理,一般廠商是不提供的,內(nèi)部資料,非常有用,希望能給大家有參考作用,開發(fā)環(huán)境QUARTUS II 6.0,CPLD為EPM240T100C5N,超便宜,比EPM712
    發(fā)表于 02-18 14:02

    對新手非常有用的電子器件基礎(chǔ)資料

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 對新手非常有用的電子器件基礎(chǔ)資料PCB打樣找華強(qiáng) http://www.hqpcb.com/3 樣板2天出貨
    發(fā)表于 10-20 20:13

    03國賽控制類準(zhǔn)備步驟,非常有用

    這是關(guān)于國賽準(zhǔn)備的一些模塊原理圖以及相關(guān)PCB布線等的步驟,非常有用
    發(fā)表于 01-23 22:00

    MPLAB Harmony C++怎么使用

    MPLAB和諧文檔(在什么是MPLAB和諧?)“MPLA-和聲沒有用C++測試過,因此,沒有提供對這個(gè)編程語言的支持?!薄獙τ?018來說非常令人難以置信。有人成功地使用C++和和聲
    發(fā)表于 09-20 09:40

    請問有沒有用C++開發(fā)STM32的

    我大學(xué)學(xué)的C++,相對C語言來說更喜歡C++語言,只是不知道有沒有用C++開發(fā)STM32程序的,不是指僅僅玩玩,而是有沒
    發(fā)表于 10-26 08:42

    CodeWarrior C and C++ and Assembly 語言參考設(shè)計(jì)

    本文是英文版的,介紹了CodeWarrior C and C++ and Assembly 語言參考設(shè)計(jì),在您的設(shè)計(jì)中或許有用
    發(fā)表于 06-22 15:33 ?74次下載

    大話設(shè)計(jì)模式C++

    讓大家全方位傻瓜式學(xué)習(xí)大話設(shè)計(jì)模式C++。
    發(fā)表于 07-13 15:11 ?7次下載

    Vim中默認(rèn)未啟用但實(shí)際非常有用的選項(xiàng)

    Vim 作為一款功能強(qiáng)大、選項(xiàng)豐富的編輯器,為許多用戶所熱愛。本文介紹了一些在 Vim 中默認(rèn)未啟用但實(shí)際非常有用的選項(xiàng)。雖然可以在每個(gè) Vim 會(huì)話中單獨(dú)啟用,但為了創(chuàng)建一個(gè)開箱即用的高效編輯環(huán)境,還是建議在 Vim 的配置文件中配置這些命令。
    的頭像 發(fā)表于 09-25 17:54 ?5329次閱讀

    C++語言的基本構(gòu)成詳細(xì)資料說明

    C++語言中的數(shù)據(jù)類型、運(yùn)算、語句結(jié)構(gòu)、數(shù)組、指針、函數(shù)是C++程序設(shè)計(jì)的基礎(chǔ)。掌握這些基本內(nèi)容,對利用C++語言解決一般應(yīng)用問題是非常必要和有用
    發(fā)表于 02-19 14:49 ?0次下載
    <b class='flag-5'>C++</b>語言的基本構(gòu)成詳細(xì)資料說明

    C++常見設(shè)計(jì)模式解析與實(shí)現(xiàn)

    C++常見設(shè)計(jì)模式解析與實(shí)現(xiàn)說明。
    發(fā)表于 06-01 15:44 ?11次下載

    CC++混合編程是什么

    這篇文章講解的知識(shí)點(diǎn)很“小”,但是在CC++的混合編程中非常重要。因?yàn)槲覀冊趯憫?yīng)用程序時(shí),經(jīng)常利用到第三方的程序。如果我們的代碼用C,但是第三方代碼是
    的頭像 發(fā)表于 02-14 13:48 ?1335次閱讀
    <b class='flag-5'>C</b>與<b class='flag-5'>C++</b>混合編程是什么

    17個(gè)非常有用的Python技巧

    Python 是一門非常優(yōu)美的語言,其簡潔易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 帶我們回顧了 17 個(gè)非常有用的 Python 技巧,例如查找、分割和合并列表等。這 17 個(gè)技巧都非常簡單
    的頭像 發(fā)表于 04-10 14:28 ?455次閱讀

    一個(gè)簡單但非常有用的小前置放大器電路

    一個(gè)簡單但非常有用的小前置放大器電路可以通過連接幾個(gè)晶體管來構(gòu)建。該裝置可輕松將 1mV 信號(hào)提升至 100mV 甚至更高。因此,它非常方便放大不能直接與功率放大器一起使用的極小信號(hào)。
    的頭像 發(fā)表于 06-10 17:27 ?1460次閱讀
    一個(gè)簡單但<b class='flag-5'>非常有用</b>的小前置放大器電路

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

    FPGA是非常有用的器件,通常與ADI公司的ADC或功率IC等一起設(shè)計(jì)到客戶的設(shè)計(jì)中。FPGA 可以實(shí)現(xiàn)微控制器和所需的任何膠水邏輯。在這篇博客中,我將討論一些與功能安全和FPGA相關(guān)的問題。
    的頭像 發(fā)表于 06-29 10:28 ?1275次閱讀
    沒有什么是完美的,但FPGA可能<b class='flag-5'>非常有用</b>

    c++多行注釋快捷鍵

    C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個(gè)語句的方法。當(dāng)你希望暫時(shí)禁用一些代碼或者解釋特定部分代碼的作用時(shí),多行注釋是非常有用的。 在C++中,多行注釋以 /* 開始,以
    的頭像 發(fā)表于 11-22 10:24 ?6779次閱讀