接口的设计(让类被正确的使用)——《Effective c++》
2017-04-20 11:04
225 查看
要开发一个不容易被误用的类,我们就要首先考虑用你的类的用户可能会犯怎样的错误
//首先介绍一下explicit //考虑如下代码: class String { String ( int n ); //本意是预先分配n个字节给字符串 String ( const char* p ); // 用C风格的字符串p作为初始化值 ... } String s2 ( 10 ); //OK 分配10个字节的空字符串 String s3 = String ( 10 ); //OK 分配10个字节的空字符串 String s4 = 10; //编译通过,也是分配10个字节的空字符串 String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串 //s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。 //为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字,这样,后面的两个操作将不会被编译通过
//explicit 预防出现隐式转换 struct Day{ explicit Day(int d) :val(d){}; int val; }; struct Month{ explicit Month(int m) :val(m){}; int val; }; struct Year{ explicit Year(int y) :val(y){}; int val; }; class Date{ private: Year _year; Month _month; Day _day; public: Date(const Month& mon, const Day& day, const Year& year) :_year(year), _month(mon), _day(day){}; }; int main(){ // Date d(1,4,5); //错误 // Date d(Month(5),Year(2015),Day(25)); //错误 Date d(Month(5),Day(25),Year(2015)); //正确 //防止用户不小心误用 system("pause"); return 0; } //为了防止用户输入的Date符合标准,比如一年只有十二个月,我们也可以这样设计class Month(其他的如每月的天数同样可以如此) class Month{ public: static Month Jan(){ return Month(1); }; //... explicit Month(int m) :val(m){}; private: int val; }; //然后用户调用接口时,就只能写这样的代码: Date d(Month::Jan(), Day(25), Year(2015)); //正确 //规范用户的行为,为用户考虑到所有可能犯错的方面 //当然,以上的例子太过于理想化了,但是这个思想是可以借鉴的。就这样
相关文章推荐
- 重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用
- [Effective C++ --018]让接口容易被正确使用,不易被误用
- Effective C++ 学记之18 让接口容易被正确使用,不易被误用。
- Effective C++(18) 让接口更容易被正确使用,不易被误用
- effective c++:让接口容易被正确使用,不易被误用
- Effective C++ 条款18 让接口容易被正确使用,不易被误用
- Effective c++学习笔记条款18:让接口容易被正确使用,不易被误用
- Effective C++:条款18:让接口容易被正确使用,不易被误用
- 《Effective C++》Rule 18: 让接口容易被正确使用,不易被误用
- 读书笔记《Effective C++》条款18:让接口容易被正确使用,不易被误用
- effective c++让接口容易被正确使用,不易被误用
- Effective C++ -----条款18:让接口容易被正确使用,不易被误用
- 《Effective C++》学习笔记条款18 让接口容易被正确使用,不易被误用
- effective C++ 条款 18:让接口容易被正确使用,不易被误用
- effective c++ 条款18:使接口易于正确使用,而难以错误使用
- 读书笔记《Effective c++》 条款18 让接口容易被正确使用,不易被误用
- ZZ: 使用 "接口" 了解设计模式--策略模式(多态)集合框架 泛型、文件、文件流 IO(流)
- 使用AIDL(AndRoid接口描述语言)设计和使用远程接口
- Android SDK开发指南(翻译)系列三:Tools(一)--使用AIDL, 设计一个远程接口
- 有效的使用和设计COM智能指针——条款6:尽量以智能指针替换接口指针