条款28:避免使用handles指向对象内部成分

看下面的问题:

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:

 std::tr1::shared_ptr<RectData> pData;

};

现在获取Rectangle的点

class Rectangle{

 public:

 ...

 Point& upperLeft() const{return pData->ulhc;}

 Point& lowerRight() const{return pData->lrhc;}

 ...

};

    这段代码有什么问题?我们的本意是pData是私有的成员。客端应该是不能够修改其点。但是这里我们可以修改:

   Point coord1(0,0);

   Point coord2(100,100);

   const Rectangle rec(coord1,coord2);

   rec.upperLeft().setX(50);//被改变了

  为什么这样?因为返回了一个代表对象内部数据的handler,降低了对象的封装性

  防止修改,我们可:

class Rectangle{

 public:

 ...

 const Point& upperLeft() const{return pData->ulhc;}

 const Point& lowerRight() const{return pData->lrhc;}

 ...

};

 但是这不能够改变问题的根本。如:某个函数返回GUI对象的外框

class GUIObject{...};

const Rectangle boundingBox(const GUIObject& obj);

现在,客户可能这样使用:

GUIObject* pgo;

...

const Point* pUpperLeft = &(boundingBox(*pgo).upperLeft());

 pUpperLeft会造成悬空指针。因为返回的只是一个临时对象,语句结束临时对象会被销毁。

所以我们说“返回一个handler代表对象内部成分”总是危险的。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值