/*条款23:宁以non-member,non-friend 替换member函数*/
#include<iostream>
using namespace std;
class WebBorwser{
public:
void clearCache(){}
void clearHistory(){}
void removeCookies(){}
//...
void clearEverything(){//1
clearCache();
clearHistory();
removeCookies();
}
};
void clearBrowser(WebBorwser &wb){//2
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
/*把清除所有的动作放在类内还是类外??
理论:条款22曾说成员变量应该是私有,因为如果不是,就有无限的函数可以访 问它们也就失去封装性 能够访问私有成员变量的函数只有类内的成员函数 与友元函数也就是说放在类内的清除函数扩大了私有数据被访问的可能
解决:1 对于所有的函数定义在类内的语言(JAVA,C#)也可以把清除所有函数定义在某个工具类(utility class的一个static member函数,只要它不是WebBrowser的一部分或是友元,就不会影响WebBrowser的成员封装性)
2 namespace WebBrowserStuff{
class WebBrowser{...}
void clearBrowser(WebBrowser&wb);
提示:namespace可以跨越多个源码文件而后者不能
------------------
WebBrowser类内还可能有其他大量便利函数
通常大多数客户只对其中某些感兴趣,没道理对书签便利函数感兴趣的窗户却与一个cookie相关便利函数发生编译相依关系,那么分离方法是:
//对文件“webbrowser.h" 这个头文件针对 class WebBrowser自身
namespace WebBrowserStuff{
class WebBrowser{...}
}
//头文件"webbrowserbookmarks.h"
namespace WebBrowserStuff{
.....//书签相关的便利函数
}
//头文件"webbrowsercookis.h"
namespace WebBrowserStuff{
...//与cookie相关的便利函数
}
非成员友元函数可增加封装性,包裹弹性,机能扩充性
*/
int main(){
system("pause");
return 0;
}
条款23:宁以non-member,non-friend 替换member函数
最新推荐文章于 2025-03-26 19:29:18 发布