Effective C++ 條款18:讓接口容易被正確使用,不易被誤用

Effective C++ 條款18:讓接口容易被正確使用,不易被誤用


核心思想設計接口時,應使正確使用方式直觀自然,同時通過類型系統、行為約束等手段主動預防常見錯誤,減少用戶犯錯的可能性。

?? 1. 接口誤用的常見陷阱

日期類典型錯誤

class Date {
public:Date(int month, int day, int year);  // 原始接口// ...
};// 易錯調用:參數順序混亂
Date d(30, 3, 2023);  // 應該是(3,30,2023) → 月份30無效

資源管理陷阱

// 返回裸指針:誰負責釋放?
Investment* createInvestment(); // 可能忘記釋放 → 內存泄漏
// 或重復釋放 → 程序崩潰

🚨 2. 解決方案:防御性接口設計

類型安全包裝(Type-Safe Wrapping)

// 封裝年月日為獨立類型
struct Month {explicit Month(int m) : val(m) {}int val;
};
struct Day { /* 類似實現 */ };
struct Year { /* 類似實現 */ };class Date {
public:Date(const Month& m, const Day& d, const Year& y); // 安全接口
};Date d(Month(3), Day(30), Year(2023));  // 正確調用
Date d2(Day(30), Month(3), Year(2023)); // 編譯錯誤!類型不匹配

智能指針自動管理

// 返回智能指針:明確所有權
std::shared_ptr<Investment> createInvestment();// 自動釋放資源
// 可附加自定義刪除器

?? 3. 關鍵設計原則與技巧
設計原則實現技巧效果
強類型封裝包裝原始類型為域特定類型防止參數順序錯誤
限制有效值范圍使用枚舉/靜態檢查避免非法參數輸入
保持接口一致性遵循標準庫命名/行為慣例降低學習成本
資源所有權明確化返回智能指針而非裸指針防止資源泄漏
行為兼容內置類型自定義類型支持與內置類型相同的操作符合用戶直覺

值范圍限制技巧

class Month {
public:static Month Jan() { return Month(1); }  // 工廠函數static Month Feb() { return Month(2); }// ...其余月份
private:explicit Month(int m);  // 私有構造
};// 使用示例:
Date d(Month::Mar(), Day(30), Year(2023));  // 安全構造

自定義刪除器集成

// 自定義資源釋放函數
void releaseInvestment(Investment* p); // 返回帶自定義刪除器的智能指針
std::shared_ptr<Investment> createInvestment() {return std::shared_ptr<Investment>(new Investment(), releaseInvestment  // 綁定刪除器);
}

💡 關鍵原則總結

  1. 類型安全優先
    • Month/Day等域類型代替原始int
    • 禁用隱式類型轉換(explicit構造函數)
  2. 接口自解釋性
    • 參數名稱/類型傳達使用意圖
    • 限制參數有效范圍(如月份1-12)
  3. 所有權透明化
    • 工廠函數返回智能指針而非裸指針
    • 使用shared_ptr/unique_ptr明確資源歸屬
  4. 行為一致性
    • 自定義類型支持+/-等運算符
    • 容器接口與STL保持一致

錯誤接口設計重現

// 問題接口:原始指針+模糊參數
void* openFile(const char* name, int mode);// 典型誤用:
File* f = (File*)openFile("data", 'r');  // 錯誤1:類型不安全// 錯誤2:模式參數錯誤

安全重構方案

// 解決方案1:強類型封裝
class FileHandle {
public:enum OpenMode { Read, Write, Append };explicit FileHandle(const std::string& name, OpenMode mode = Read);~FileHandle();  // 自動關閉文件// ...
};// 解決方案2:工廠函數+智能指針
std::unique_ptr<FileHandle> openFile(const std::string& name,FileHandle::OpenMode mode = FileHandle::Read
);// 使用示例:
auto file = openFile("data.txt", FileHandle::Read);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94109.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nodejs讀寫文件

1.讀文件 node有很多模塊&#xff0c;可在node模塊查看相應模塊&#xff1b; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果發生錯誤&#xff0c;data是undefined 如果成功 err為null console.log(err); console.log(data); }) 2.寫文件 var…

ConcurrentHashMapRedis實現二級緩存

1. 為什么使用ConcurrentHashMap&#xff1f;在Java中&#xff0c;ConcurrentHashMap 是一個線程安全且高效的哈希表實現&#xff0c;廣泛用于高并發場景。將其用作一級緩存的原因主要包括以下幾點&#xff1a;1.1. 線程安全性ConcurrentHashMap 是線程安全的&#xff0c;支持多…

Mysql集群技術

實驗在RHEL7中做&#xff0c;因為9中缺少了一個關鍵的高可用組件環境&#xff1a;兩臺數據庫&#xff0c;內存和CPU要多一點主流是MYSQL&#xff08;開源&#xff09;&#xff0c;Oracle收費較貴RHEL7中直接用make編譯是有問題的&#xff0c;所以需要要gcc工具做好前置準備&…

自動駕駛嵌入式軟件工程師面試題【持續更新】

文章目錄前言請描述 CAN 幀的基本結構&#xff08;包括標識符、數據字段、CRC 等&#xff09;描述 WebSocket 協議的基本工作流程&#xff08;包括握手、數據幀結構&#xff09;請說明如何實現 WebSocket 連接的心跳機制以檢測連接狀態&#xff0c;并描述在斷開后如何通過重連策…

vue(5)-組件

一.組件三大組成部分&#xff08;結構/樣式/邏輯&#xff09;&#xff08;1&#xff09;組件樣式沖突用scoped全局樣式在組件中起全局作用&#xff0c;局部樣式可以加scoped屬性來只作用于當前組件圖中只給baseone加這個樣式&#xff0c;就在baseone中style加scoped&#xff08…

【機器學習】兩大線性分類算法:邏輯回歸與線性判別分析:找到分界線的藝術

文章目錄一、核心概念&#xff1a;數據分類的"切分線"二、工作原理&#xff1a;從"找分界線"理解二、常見算法1、邏輯回歸&#xff1a;二分類2、線性判別分析&#xff08;LDA&#xff09;&#xff1a;分類與降維3、兩種算法對比分析三、實際應用&#xff1…

靜態分析c/cpp源碼函數調用關系圖生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 靜態代碼調用結構圖分析、構建、生成 doxygen doxygen在win和linux上均可運行&#xff0c;可以自動分析源碼&#xff0c;對c語言項目友好&#xff0c;預處…

使用 MySQL Shell 進行 MySQL 單機到 InnoDB Cluster 的數據遷移實踐

遷移背景與環境原來都是用mysqldump&#xff0c;DTS或者cdc遷移&#xff0c;這次8.0用了下新工具感覺挺好用的&#xff0c;簡單快捷&#xff0c;30G數據不到源環境&#xff1a;單機 MySQL 8.0&#xff0c;地址為 172.23.3.28目標環境&#xff1a;InnoDB Cluster 集群&#xff0…

淘寶商品API可以獲取哪些商品詳情數據?

商品詳情頁商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制軟件平臺EsDA-AWStudio

在工業自動化和智能制造領域&#xff0c;高效的軟件平臺是提升開發效率和系統性能的關鍵。ZLG致遠電子推出的EsDA-AWStudio平臺&#xff0c;憑借其強大的功能和靈活的設計&#xff0c;為工業控制和物聯網應用提供了全新的解決方案。一站式PLC工業控制軟件平臺EsDA-AWStudioZLG致…

基于深度學習的醫學圖像分析:使用MobileNet實現醫學圖像分類

前言 醫學圖像分析是計算機視覺領域中的一個重要應用&#xff0c;特別是在醫學圖像分類任務中&#xff0c;深度學習技術已經取得了顯著的進展。醫學圖像分類是指將醫學圖像分配到預定義的類別中&#xff0c;這對于疾病的早期診斷和治療具有重要意義。近年來&#xff0c;MobileN…

docker 容器常用命令

在平常的開發工作中&#xff0c;我們經常需要使用 docker 容器&#xff0c;那么常用的 docker 容器命令有哪些呢&#xff1f;今天簡單總結下。 一&#xff1a;查看容器查看運行的容器&#xff1a;docker ps查看所有的容器&#xff1a;docker ps a查看容器詳細信息&#…

重型機械作業誤傷預警響應時間縮短80%!陌訊多模態識別算法在工程現場的應用優化

一、行業痛點&#xff1a;機械作業場景的識別困境據《工程機械安全白皮書&#xff08;2025&#xff09;》統計&#xff0c;施工現場因機械盲區導致的工傷事故中??78.3%由識別延遲引發??。核心難點包括&#xff1a;??動態遮擋問題??&#xff1a;吊臂擺動導致目標部件部分…

2025年ESWA SCI1區TOP,強化學習多目標灰狼算法MOGWO-RL+分布式混合流水車間調度,深度解析+性能實測

目錄1.摘要2.問題描述和數學建模3.強化學習多目標灰狼算法MOGWO-RL4.結果展示5.參考文獻6.算法輔導應用定制讀者交流1.摘要 本文針對大規模個性化制造&#xff08;MPM&#xff09;中的調度問題&#xff0c;提出了一種新的解決方案。MPM能夠在確保大規模生產的前提下&#xff0…

Mac 系統下安裝 nvm

Mac 系統下安裝 nvm nvm 全稱為 node version manger&#xff0c;顧名思義就是管理 node 版本的一個工具&#xff0c;通過這個工具&#xff0c;我們可以在一臺計算機上安裝多個版本的 node&#xff0c;并且隨時進行無縫的切換。 1. 卸載原本的 node.js&#xff08;重要&#xf…

變量篩選—隨機森林特征重要性

對于接觸算法模型不久的小伙伴來說,建模中海量變量篩選總是讓人頭疼,不知道如何把握。之前已經介紹了一些變量篩選的方法:變量篩選一張圖、【變量篩選】計算類別型變量IV值、KS值、一文囊括風控建模中的變量篩選方法、變量篩選—特征包含信息量。本文詳細介紹通過隨機森林算…

【設計模式】 3.設計模式基本原則

單一職責原則 對于一個類而言&#xff0c;有且僅有一個引起他變化的原因或者說&#xff0c;一個類只負責一個職責 如果一個類承擔的職責過多&#xff0c;那么這些職責放在一起耦合度太高了&#xff0c;一個職責的變化可能會影響這個類其他職責的能力。 所以我們在做軟件設計的時…

ABP VNext + Redis Bloom Filter:大規模緩存穿透防護與請求去重

ABP VNext Redis Bloom Filter&#xff1a;大規模緩存穿透防護與請求去重 &#x1f680; &#x1f4da; 目錄ABP VNext Redis Bloom Filter&#xff1a;大規模緩存穿透防護與請求去重 &#x1f680;TL;DR ?1. 引言 &#x1f389;2. 環境與依賴 &#x1f6e0;?3. Bloom Filt…

構建工具和腳手架:從源碼到dist

構建工具和腳手架&#xff1a;從源碼到dist**1. 為什么需要工程轉換&#xff1f;****2. 構建工具的核心職責**為什么要求轉換**1&#xff09;明確三種關鍵問題****&#xff08;2&#xff09;Webpack 的打包機制****3. 開發服務器&#xff08;Webpack Dev Server&#xff09;***…

數字化生產管理系統設計

下面提供一個基于Python的數字化管理系統框架&#xff0c;使用現代技術棧實現。這個系統將包含設備監控、故障管理、裝配配套表生成、生產計劃管理等功能。系統架構數字化生產管理系統 ├── 設備監控模塊 ├── 故障管理模塊 ├── 產品裝配管理模塊 ├── 生產計劃管理模…