条款28:避免返回handles指向对象的内部成分。
2024-08-27 02:07:23
首先看看下面这个例子:
class Point{
public:
point(int x, int y);
...
void setX(int newVal);
void setY(int newVal);
...
};
struct RectData{
Point ulhc; //左上角
Point lrhc; //右下角
};
class Rectangle{
...
private:
shared_ptr<RectData> pData;
};
那么如果出现下面这种成员函数的话:
class Rectangle{
public:
...
Point & upperLeft() const {return pData->ulhc; }
Point & lowerRight() const{return pData->lrhc; }
...
}
这样只是能通过编译,但是设计确是错误的,在成员函数被声明为const的情况下返回了一个内部成员的引用,这样使得ulhc 以及 lrhc对象都可以被更改。但是二者都是private的,实际上二者都是不应该被改变的。
这正是由于返回的是引用,同样的返回指针,迭代其这种叫做handle的对象都是会造成内部状态暴露在外面。
这些问题实际上在每个方法的返回的handle上加上const就会得到解决。
class Rectangle{
public:
...
const Point & upperLeft() const {return pData->ulhc; }
const Point & lowerRight() const{return pData->lrhc; }
...
}
但是几十这样做仍然可能会导致造成虚调handle的现象发生:
class GUIobject{...};
const Rectangle
boundingBox(const GUIobject & obj);
//那么,当用户这样去使用他的时候
GUIobject * pgo;
...
const Point * pUpperLeft =
&(boundingBox(*pgo).pUpperLeft());
这样实际上将Rectancle中的Point对象传递出去了,这样当临时对象析构的时候,这个指针就会编程一个空悬的指针(感觉通过智能指针就能解决啊),这样也带来了风险。
小结:
避免返回Handle指向内部对象,这样可以增加封装性,帮助const函数的行为像是一个const,并将空悬Handle的可能性降到最低。
最新文章
- [翻译] ORMLite document -- How to Use Part (一)
- mysql日志详细解析
- P问题、NP问题和NPC问题
- poj1981Circle and Points(单位圆覆盖最多的点)
- 基于PinnedSectionListView实现联系人通讯录并且点击打电话
- [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
- Rythm.js 使用教程详解
- Gradle 1.12用户指南翻译——第五十三章. 签名插件
- 树链剖分——边权poj2763
- 阿里云IoT
- OrCAD Capture CIS 16.6 在原理图页面内放置图片
- 关于连接oracle工具plsql的一些使用
- 《RabbitMQ Tutorial》译文 第 1 章 简介
- mac gcc develop
- acl 4 year statistics
- JMH 使用指南 - java 性能测试
- Mysql 关闭自动commit
- js的栈与堆
- mysql数据库从删库到跑路之select单表查询
热门文章
- (4.7)sql server2008 中的merge
- php采集
- pycharm修改配置
- Django:学习笔记(2)——创建第一个应用
- 安装三大浏览器驱动driver
- tesseract 3.05 release 编译
- qt项目: error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1900”不匹配值“1800”
- 20145201 《Java程序设计》第一周学习总结(修改)
- Gradle命令详解与导入第三方包--快速打包
- Spring AOP(3)