精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(fā) 前端
類是C++中的主要抽象單位,你應該將抽象原則應用于你的類,盡可能將接口與實現(xiàn)分離。具體來說,你應該使所有數據成員私有,并可選擇性地提供getter和setter方法。

一、建立穩(wěn)定接口

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

1.使用接口和實現(xiàn)類

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

好消息是你可以讓你的接口更加干凈,并隱藏所有實現(xiàn)細節(jié),從而實現(xiàn)穩(wěn)定的接口。壞消息是這需要一些編碼工作。基本原則是為你想編寫的每個類定義兩個類:接口類和實現(xiàn)類。實現(xiàn)類與你在不采取此方法時編寫的類相同。接口類提供與實現(xiàn)類相同的公共方法,但它只有一個數據成員:指向實現(xiàn)類對象的指針。這被稱為pimp習語,私有實現(xiàn)習語,或橋接模式。接口類的方法實現(xiàn)簡單地調用實現(xiàn)類對象上的等效方法。

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

要在Spreadsheet類中使用此方法,請定義以下公共接口類,稱為Spreadsheet。

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;

實現(xiàn)類Impl是一個私有嵌套類,因為除了Spreadsheet類之外,沒有人需要了解這個實現(xiàn)類。現(xiàn)在,Spreadsheet類只包含一個數據成員:指向Impl實例的指針。公共方法與舊的Spreadsheet類相同。

2.掌握類和對象

嵌套的Spreadsheet::Impl類在spreadsheet模塊的實現(xiàn)文件中定義。它應該對客戶端隱藏,因此不導出Impl類。Spreadsheet.cpp模塊實現(xiàn)文件如下開始:

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類相同的接口。對于方法實現(xiàn),需要記住Impl是一個嵌套類;因此,你需要指定作用域為Spreadsheet::Impl。所以,對于構造函數,它變成了Spreadsheet::Impl::Impl(...)。

由于Spreadsheet類具有指向實現(xiàn)類的unique_ptr,因此Spreadsheet類需要有用戶聲明的析構函數。由于我們不需要在此析構函數中執(zhí)行任何操作,因此可以在實現(xiàn)文件中將其默認為:

Spreadsheet::~Spreadsheet() = default;

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

二、實現(xiàn)Spreadsheet方法

Spreadsheet類的方法實現(xiàn),如setCellAt()和getCellAt(),只是將請求傳遞給底層的Impl對象:

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以執(zhí)行其工作:

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指針來獲取對象本身。

Spreadsheet賦值運算符必須同樣將賦值傳遞給底層的Impl:

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

賦值運算符中的第一行看起來有些奇怪。Spreadsheet賦值運算符需要將調用轉發(fā)給Impl賦值運算符,這只在你復制直接對象時運行。通過解引用m_impl指針,你強制執(zhí)行直接對象賦值,這導致調用Impl的賦值運算符。

swap()方法簡單地交換單一數據成員:

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

這種技術將接口與實現(xiàn)真正分離,是非常強大的。雖然一開始有些笨拙,但一旦習慣了,你會發(fā)現(xiàn)它很自然易用。然而,在大多數工作環(huán)境中,這不是常見做法,所以你可能會遇到同事的一些抵觸。支持這種做法的最有力論據不是分離接口的美學,而是如果類的實現(xiàn)發(fā)生變化,構建時間的加速。

三、注意

使用穩(wěn)定的接口類,可以減少構建時間。將實現(xiàn)與接口分離的另一種方法是使用抽象接口,即只有純虛方法的接口,然后有一個實現(xiàn)該接口的實現(xiàn)類。這是下個主題。

責任編輯:趙寧寧 來源: coding日記
相關推薦

2010-01-11 10:28:51

C++編程

2024-01-03 13:38:00

C++面向對象編程OOP

2010-01-12 15:24:48

C++語言

2011-05-30 15:29:32

C++

2025-07-11 04:00:00

2010-01-26 17:11:13

C++編程

2024-04-01 13:05:13

C++接口類開發(fā)

2011-07-10 15:26:54

C++

2024-01-22 00:10:00

C++接口編程

2011-07-13 16:36:11

C++

2024-09-24 10:41:57

MyBatis編程

2010-01-12 10:40:22

C++程序員

2012-12-25 09:45:08

PythonWeb

2010-01-11 10:41:05

C++編程

2023-11-22 13:40:17

C++函數

2025-01-27 00:54:31

2025-04-02 03:11:00

Python函數C++

2010-01-13 10:16:42

C++軟件

2023-12-13 10:01:15

數據結構c++編程

2025-06-30 02:22:00

C++高性能工具
點贊
收藏

51CTO技術棧公眾號

蜜桃一区二区三区四区| 久久er热在这里只有精品66| 国产精品亚洲成人| 久久乐国产精品| 人人妻人人藻人人爽欧美一区| 日韩av一卡| 国产精品久久久久永久免费观看 | 美女100%一区| 亚洲欧洲另类国产综合| 国产精品国模大尺度私拍| 特级西西444www大精品视频免费看| av在线不卡顿| 欧美一区二区视频在线观看2020 | 粉嫩在线一区二区三区视频| 欧美一级高清免费播放| 精品一区二区在线观看视频| 青草伊人久久| 欧美色手机在线观看| www污在线观看| 9色在线视频网站| 高潮精品一区videoshd| 国产精品亚洲欧美导航| 日韩伦理在线视频| 999视频精品| 亚洲欧美日韩图片| 久久久久亚洲av无码专区首jn| 成人激情综合| 午夜视频一区二区三区| 在线观看成人av| 蜜桃免费在线| 北条麻妃国产九九精品视频| 国产精品久久中文| 国产又大又黄又粗| 激情欧美丁香| 欧美成人精品不卡视频在线观看| 亚洲高潮女人毛茸茸| 亚洲动漫精品| 日韩精品在线私人| 中文字幕在线国产| 日本精品国产| 777a∨成人精品桃花网| 一路向西2在线观看| 伊人久久av| 欧美日韩亚洲一区二区三区| 久草免费福利在线| 大香伊人中文字幕精品| 亚洲精选在线视频| 国产树林野战在线播放| 3d成人动漫在线| 中文字幕不卡三区| 亚洲不卡1区| 涩爱av在线播放一区二区| av中文一区二区三区| 成人黄色片视频网站| www.天天干.com| 国产成人综合视频| yy111111少妇影院日韩夜片| 性欧美一区二区三区| 国产很黄免费观看久久| 成人综合色站| 日韩一级在线播放| 91麻豆swag| 日韩精品久久久免费观看| 精品乱码一区二区三四区视频 | 欧美精品成人久久| 欧美日韩国产精品一区二区亚洲| 美女久久久久久久| 久久国产免费观看| 一区二区高清| 日本中文字幕不卡免费| 久草热在线观看| 麻豆精品一区二区三区| 91综合免费在线| 高清乱码毛片入口| 91视频免费播放| 日韩和欧美的一区二区| 欧美性天天影视| 亚洲一区二三区| 人妻精品无码一区二区三区 | 在线观看一区二区精品视频| 激情 小说 亚洲 图片: 伦| 国产精品原创视频| 日韩视频免费观看高清完整版在线观看 | 韩国一级黄色录像| 国产一区激情| 日本一区二区三区四区视频| 国产精品伦理一区| 岛国一区二区三区| 色综合久久久久久久久五月| 国产黄大片在线观看画质优化| 亚洲国产欧美日韩另类综合| 美女福利视频在线| 91成人精品观看| 日韩av在线导航| 99热6这里只有精品| 黑丝一区二区三区| 日本久久久久亚洲中字幕| 在线免费看91| 99久久免费视频.com| 亚洲日本精品国产第一区| 日本无删减在线| 欧美在线观看你懂的| 色诱av手机版| 99久久亚洲精品| 欧美在线欧美在线| aaaa一级片| 国产欧美一区二区三区网站| 大荫蒂性生交片| 欧美系列精品| 亚洲色图校园春色| 日本中文字幕网| 激情综合色播五月| 欧美亚州在线观看| heyzo一区| 欧美一区二区三区公司| 中国毛片在线观看| 亚洲欧洲午夜| 97在线资源站| 美女国产在线| 欧美无砖砖区免费| 亚洲综合色一区| 亚洲高清久久| 91手机在线播放| 欧美日本高清| 在线一区二区三区四区五区| wwwxx日本| 影视亚洲一区二区三区| 亚洲蜜臀av乱码久久精品 | 老司机一区二区三区| 99久久国产免费免费| 91网在线播放| 日本乱码高清不卡字幕| 中文字幕在线视频播放| 影音先锋日韩在线| 成人精品一区二区三区电影免费| 国产三级在线免费| 成人在线免费公开观看视频| 在线视频免费在线观看一区二区| 成人深夜直播免费观看| 国产成人三级视频| 欧美办公室脚交xxxx| 日韩视频免费观看高清完整版在线观看 | 韩国女主播成人在线| 日本一区二区在线| 女生影院久久| 亚洲精品久久久久久下一站 | 欧美精品一区免费| 美女国产精品久久久| 久久精品国亚洲| 中文字幕视频免费观看| 国产清纯白嫩初高生在线观看91| 97成人在线观看视频| 精品按摩偷拍| 免费在线日韩av| 九九九九九九精品| 在线精品亚洲欧美日韩国产| 亚洲精品wwww| 成年人视频在线免费看| 91麻豆高清视频| 国产精品亚洲a| 精品久久久久久久久久久下田| 久久免费成人精品视频| 国产av一区二区三区精品| 久久成人综合| 国产乱人伦真实精品视频| 丁香在线视频| 欧美色综合久久| 国产精品青青草| 2021天堂中文幕一二区在线观| 精品久久五月天| 国产成人无码一区二区三区在线 | 欧美午夜精品一区二区| 狠狠色狠狠色综合日日tαg| 国产伦精品一区二区三区四区免费 | 日本一区二区三区在线播放| 成人好色电影| 91精品国产乱| 国产毛片久久久久久久| 三级成人在线| 亚洲天堂网在线观看| 欧美男人天堂网| 成人免费小视频| 欧美熟妇精品一区二区蜜桃视频| 中文字幕国产一区| 免费h精品视频在线播放| 亚洲a∨精品一区二区三区导航| 亚洲一区二区黄| 99精品久久久久久中文字幕 | 九九热只有精品| 99久久er热在这里只有精品15| 成年人免费在线播放| 波多野结衣网站| 久久久精品综合| 欧美一级小视频| 自拍视频亚洲| 国产区二精品视| 成人全视频免费观看在线看| 欧美激情一级二级| www.亚洲视频| 亚洲国产精品99| 中文字幕在线日亚洲9| 一区二区成人在线| 亚洲第一视频区| 成人av综合在线| 永久av免费网站| 日本aⅴ精品一区二区三区| 欧美做受777cos| 国产99久久精品一区二区300| 91精品视频免费| 亚洲成人激情社区| 久久免费视频在线| jizzjizz亚洲| 在线成人中文字幕| 天天影院图片亚洲| 日韩精品一区二区三区视频播放| 免费在线观看av的网站| 亚洲成人激情自拍| 91插插插插插插| 国产精品色噜噜| 国产手机在线观看| www.欧美色图| 中文字幕第九页| 国产激情视频一区二区三区欧美 | 亚洲成人激情在线观看| 中国一级片黄色一级片黄| 精品日韩中文字幕| 精品肉丝脚一区二区三区| 综合久久一区二区三区| 成人免费视频入口| 一区二区三区精品视频| 在线亚洲美日韩| 九九视频精品全部免费播放| 国产成人成网站在线播放青青| 先锋影音网一区二区| 清纯唯美亚洲激情| 激情视频网站在线播放色| 欧美精品在线免费播放| 麻豆tv入口在线看| 精品国产欧美一区二区三区成人| 国产日韩精品在线看| 亚洲欧美www| 内衣办公室在线| 亚洲欧美一区二区三区久久| 探花视频在线观看| 国产美女一区二区三区| 亚洲一级片网站| 日本不卡高清视频| 在线观看亚洲色图| 久久电影网电视剧免费观看| 少妇一级淫免费播放| 久久国产欧美日韩精品| 天堂视频免费看| 国产一区二区三区在线观看精品| 亚洲精品乱码久久久久久动漫| 国产一区在线观看视频| 三上悠亚 电影| a级片在线播放| 91麻豆精品国产91久久久| 国产又粗又猛又色又| 欧美一区二区三区色| www.99视频| 亚洲福利视频在线| 黄色毛片在线观看| 在线看日韩av| 50度灰在线| 久久久久久久激情视频| 欧美大胆a人体大胆做受| 国产精品电影网站| 成人污污视频| 国产嫩草一区二区三区在线观看| 窝窝社区一区二区| 久久躁狠狠躁夜夜爽| av官网在线播放| 午夜精品国产精品大乳美女| 中文字幕资源网在线观看免费 | 亚洲a成人v| 动漫精品视频| 国产成人精品免费视| 波多野结衣激情| 国产欧美午夜| 污污的视频免费观看| 成人午夜免费电影| 一区二区三区久久久久| 亚洲特黄一级片| 色婷婷av国产精品| 在线电影院国产精品| 六月丁香综合网| 中文字幕少妇一区二区三区| 青春草在线视频| 国产999精品久久久| 日韩三级av高清片| 欧美精品尤物在线| 欧美不卡高清| 538在线视频观看| av一二三不卡影片| 内射一区二区三区| 色噜噜狠狠色综合中国| 精品人妻av一区二区三区| 亚洲人成电影在线播放| 特级毛片在线| 国产精品女主播视频| 国产精品美女在线观看直播| 日韩精品一区二区三区外面 | 在线观看高清免费视频| 福利电影一区二区三区| 99久久99久久精品免费看小说. | japanese国产| 国产一区二区免费| 阿v视频在线| 亚洲一区二区三区四区视频| 精品国产一区二区三区四区| 福利视频一区二区三区四区| 激情深爱一区二区| 妺妺窝人体色WWW精品| 午夜精品久久一牛影视| 99久久久国产精品无码网爆| 日韩精品久久久久| 爱看av在线| 69堂成人精品视频免费| 久久精品播放| 中文字幕在线导航| 337p粉嫩大胆色噜噜噜噜亚洲| 久久久久无码国产精品不卡| 欧美精品少妇一区二区三区 | 国产精品网友自拍| 日本高清不卡码| 亚洲精品久久久久中文字幕欢迎你 | 一区二区三区在线视频观看| 中文字幕人妻一区二区在线视频 | 日韩成人av一区| 91视频欧美| 国产成人精品福利一区二区三区| 影视亚洲一区二区三区| 国产欧美精品一二三| 国产精品日产欧美久久久久| 亚洲天堂男人av| 亚洲人成网站在线播| 三上悠亚激情av一区二区三区 | 制服丝袜中文字幕在线| 91久久精品国产| 91精品国产福利在线观看麻豆| 亚洲免费999| 亚洲欧洲国产专区| 国产精品久久影视| 美女啪啪无遮挡免费久久网站| 欧美午夜网站| 免费高清一区二区三区| 成人免费毛片嘿嘿连载视频| 日本一本高清视频| 精品网站999www| 国产欧美一区二区三区精品酒店| 欧美尤物一区| 免费人成黄页网站在线一区二区| 91导航在线观看| 欧美一区欧美二区| 男女视频在线| 裸体丰满少妇做受久久99精品| 久久九九国产| 中国1级黄色片| 日韩午夜激情电影| av中文资源在线资源免费观看| 精品高清视频| 日韩激情一二三区| 成人三级视频在线观看| 欧美一区二区三区小说| 波多野结衣中文字幕久久| 鲁片一区二区三区| 免费人成黄页网站在线一区二区| 国精产品一区一区二区三区mba | 国产白袜脚足j棉袜在线观看| 午夜久久久久久久久久一区二区| 免费a在线观看| 91手机视频在线观看| 亚洲无线视频| 少妇无套高潮一二三区| 69av一区二区三区| 成人国产电影在线观看| 日韩高清在线播放| 国产精品影视在线观看| 国产毛片aaa| 久久视频精品在线| 欧美午夜寂寞| 中文字幕永久有效| 午夜欧美在线一二页| 福利成人在线观看| 国产成人精品免费视频大全最热| 视频一区在线视频| 日韩欧美中文字幕视频| 日韩精品999| 嫩呦国产一区二区三区av| 99热成人精品热久久66| 亚洲欧美日韩在线| 久久这里精品| 不卡一卡2卡3卡4卡精品在| 水蜜桃久久夜色精品一区的特点 | 真实乱视频国产免费观看| 欧美一区二区视频在线观看2022| xxxxxx欧美| 草b视频在线观看| 中文字幕视频一区|