日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C++高級編程:構建高效穩定接口與深入對象設計技巧

來源: 責編: 時間:2023-11-22 09:14:47 325觀看
導讀一、建立穩定接口類是C++中的主要抽象單位。你應該將抽象原則應用于你的類,盡可能將接口與實現分離。具體來說,你應該使所有數據成員私有,并可選擇性地提供getter和setter方法。這就是SpreadsheetCell類的實現方式:m_valu

一、建立穩定接口

類是C++中的主要抽象單位。你應該將抽象原則應用于你的類,盡可能將接口與實現分離。具體來說,你應該使所有數據成員私有,并可選擇性地提供getter和setter方法。這就是SpreadsheetCell類的實現方式:m_value是私有的,而公共的set()方法設置值,getValue()和getString()方法檢索值。7p028資訊網——每日最新資訊28at.com

7p028資訊網——每日最新資訊28at.com

1.使用接口和實現類

即便采取了上述措施和最佳設計原則,C++語言本質上對抽象原則不友好。其語法要求你將公共接口和私有(或受保護的)數據成員及方法組合在一個類定義中,從而將類的一些內部實現細節暴露給其客戶端。這樣做的缺點是,如果你需要在類中添加新的非公開方法或數據成員,所有使用該類的客戶端都必須重新編譯。這在大型項目中可能成為負擔。7p028資訊網——每日最新資訊28at.com

好消息是你可以讓你的接口更加干凈,并隱藏所有實現細節,從而實現穩定的接口。壞消息是這需要一些編碼工作?;驹瓌t是為你想編寫的每個類定義兩個類:接口類和實現類。實現類與你在不采取此方法時編寫的類相同。接口類提供與實現類相同的公共方法,但它只有一個數據成員:指向實現類對象的指針。這被稱為pimp習語,私有實現習語,或橋接模式。接口類的方法實現簡單地調用實現類對象上的等效方法。7p028資訊網——每日最新資訊28at.com

這樣的結果是,無論實現如何改變,都不會影響公共接口類。這減少了重新編譯的需要。如果實現(僅實現)發生變化,使用接口類的客戶端無需重新編譯。請注意,這種習語僅在單一數據成員是指向實現類的指針時才有效。如果它是按值數據成員,則在實現類定義發生變化時,客戶端必須重新編譯。7p028資訊網——每日最新資訊28at.com

要在Spreadsheet類中使用此方法,請定義以下公共接口類,稱為Spreadsheet。7p028資訊網——每日最新資訊28at.com

module;#include <cstddef>export module spreadsheet;export import spreadsheet_cell;import <memory>;export class SpreadsheetApplication { };export class Spreadsheet {public:    Spreadsheet(const SpreadsheetApplication& theApp, size_t width = MaxWidth, size_t height = MaxHeight);    Spreadsheet(const Spreadsheet& src);    Spreadsheet(Spreadsheet&&) noexcept;    ~Spreadsheet();    Spreadsheet& operator=(const Spreadsheet& rhs);    Spreadsheet& operator=(Spreadsheet&&) noexcept;    void setCellAt(size_t x, size_t y, const SpreadsheetCell& cell);    SpreadsheetCell& getCellAt(size_t x, size_t y);    size_t getId() const;    static const size_t MaxHeight { 100 };    static const size_t MaxWidth { 100 };    void swap(Spreadsheet& other) noexcept;private:    class Impl;    std::unique_ptr<Impl> m_impl;};export void swap(Spreadsheet& first, Spreadsheet& second) noexcept;

實現類Impl是一個私有嵌套類,因為除了Spreadsheet類之外,沒有人需要了解這個實現類。現在,Spreadsheet類只包含一個數據成員:指向Impl實例的指針。公共方法與舊的Spreadsheet類相同。7p028資訊網——每日最新資訊28at.com

2.掌握類和對象

嵌套的Spreadsheet::Impl類在spreadsheet模塊的實現文件中定義。它應該對客戶端隱藏,因此不導出Impl類。Spreadsheet.cpp模塊實現文件如下開始:7p028資訊網——每日最新資訊28at.com

module;#include <cstddef>module spreadsheet;import <utility>;import <stdexcept>;import <format>;import <algorithm>;using namespace std;// Spreadsheet::Impl類定義。class Spreadsheet::Impl {    /* 為簡潔起見省略 */};// Spreadsheet::Impl方法定義。Spreadsheet::Impl::Impl(const SpreadsheetApplication& theApp, size_t width, size_t height): m_id { ms_counter++ }, m_width { min(width, Spreadsheet::MaxWidth) }, m_height { min(height, Spreadsheet::MaxHeight) }, m_theApp { theApp }{    m_cells = new SpreadsheetCell*[m_width];    for (size_t i{ 0 }; i < m_width; i++) {        m_cells[i] = new SpreadsheetCell[m_height];    }}// 其他方法定義省略以簡潔。

Impl類幾乎具有與原始Spreadsheet類相同的接口。對于方法實現,需要記住Impl是一個嵌套類;因此,你需要指定作用域為Spreadsheet::Impl。所以,對于構造函數,它變成了Spreadsheet::Impl::Impl(...)。7p028資訊網——每日最新資訊28at.com

由于Spreadsheet類具有指向實現類的unique_ptr,因此Spreadsheet類需要有用戶聲明的析構函數。由于我們不需要在此析構函數中執行任何操作,因此可以在實現文件中將其默認為:7p028資訊網——每日最新資訊28at.com

Spreadsheet::~Spreadsheet() = default;

事實上,它必須在實現文件中默認,而不是直接在類定義中。原因是Impl類僅在Spreadsheet類定義中前向聲明;也就是說,編譯器知道將會有一個Spreadsheet::Impl類出現在某處,但此時它還不知道定義。因此,你不能在類定義中默認析構函數,因為編譯器會嘗試使用尚未定義的Impl類的析構函數。在這種情況下,對其他方法進行默認操作時也是如此,例如移動構造函數和移動賦值運算符。7p028資訊網——每日最新資訊28at.com

二、實現Spreadsheet方法

Spreadsheet類的方法實現,如setCellAt()和getCellAt(),只是將請求傳遞給底層的Impl對象:7p028資訊網——每日最新資訊28at.com

void Spreadsheet::setCellAt(size_t x, size_t y, const SpreadsheetCell& cell) {    m_impl->setCellAt(x, y, cell);}SpreadsheetCell& Spreadsheet::getCellAt(size_t x, size_t y) {    return m_impl->getCellAt(x, y);}

Spreadsheet的構造函數必須構造一個新的Impl以執行其工作:7p028資訊網——每日最新資訊28at.com

Spreadsheet::Spreadsheet(const SpreadsheetApplication& theApp, size_t width, size_t height) {    m_impl = make_unique<Impl>(theApp, width, height);}Spreadsheet::Spreadsheet(const Spreadsheet& src) {    m_impl = make_unique<Impl>(*src.m_impl);}

拷貝構造函數看起來有些奇怪,因為它需要從源Spreadsheet復制底層的Impl。拷貝構造函數接受一個Impl的引用,而不是指針,所以你必須解引用m_impl指針來獲取對象本身。7p028資訊網——每日最新資訊28at.com

Spreadsheet賦值運算符必須同樣將賦值傳遞給底層的Impl:7p028資訊網——每日最新資訊28at.com

Spreadsheet& Spreadsheet::operator=(const Spreadsheet& rhs) {    *m_impl = *rhs.m_impl;    return *this;}

賦值運算符中的第一行看起來有些奇怪。Spreadsheet賦值運算符需要將調用轉發給Impl賦值運算符,這只在你復制直接對象時運行。通過解引用m_impl指針,你強制執行直接對象賦值,這導致調用Impl的賦值運算符。7p028資訊網——每日最新資訊28at.com

swap()方法簡單地交換單一數據成員:7p028資訊網——每日最新資訊28at.com

void Spreadsheet::swap(Spreadsheet& other) noexcept {    std::swap(m_impl, other.m_impl);}

這種技術將接口與實現真正分離,是非常強大的。雖然一開始有些笨拙,但一旦習慣了,你會發現它很自然易用。然而,在大多數工作環境中,這不是常見做法,所以你可能會遇到同事的一些抵觸。支持這種做法的最有力論據不是分離接口的美學,而是如果類的實現發生變化,構建時間的加速。7p028資訊網——每日最新資訊28at.com

三、注意

使用穩定的接口類,可以減少構建時間。將實現與接口分離的另一種方法是使用抽象接口,即只有純虛方法的接口,然后有一個實現該接口的實現類。這是下個主題。7p028資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-33367-0.htmlC++高級編程:構建高效穩定接口與深入對象設計技巧

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 12個優秀開源Web性能與用戶行為分析工具

下一篇: 解開C++之call_once的神秘面紗:記一個有意思的問題筆記

標簽:
  • 熱門焦點
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
  • onebot M24巧系列一體機采用輕薄機身設計,現已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top 主站蜘蛛池模板: 富阳市| 武汉市| 汕尾市| 田林县| 商洛市| 彝良县| 鹤山市| 泗洪县| 盈江县| 扶绥县| 扬州市| 两当县| 周宁县| 阿尔山市| 临桂县| 靖安县| 大邑县| 巢湖市| 兴文县| 玉门市| 瑞丽市| 息烽县| 和林格尔县| 蒙阴县| 南澳县| 河东区| 唐山市| 璧山县| 筠连县| 东乌珠穆沁旗| 枣阳市| 绥宁县| 郯城县| 安康市| 马龙县| 莫力| 夏邑县| 湖北省| 青神县| 青阳县| 龙里县|