标签:
class point{ point(int x,int y); ... void setx(int newval); void sety(int newval); }; struct rectdata{ point u; point l; }; class rectangle{ public: point & upperleft()const{return pdata->u;} point & upperright()const{return pdata->l;} private: std::str1::shared_ptr<rectdata> pdata; }; int main() { point coord1(0,0); point coord2(100,100); const rectangle rec(coord1,coord2); rec.upperleft().sety(50); } 这里我们能够通过最后的这个函数去修改private成员的值,那么私有成员变量就不是私有的了而是public的。 最根本的原因是由于upperleft函数返回的是一个reference 指向rectangle对象的,所以私有变量就不是私有的了,失去了安全性和封装性
const point & upperleft()const{return pdata->u;} const point & upperright()const{return pdata->l;}
但是这又会产生一个新的问题,就是point&返回的对象可能发生它所指的东西不存在了。这个例子感觉比价深啊。详见书P126
class prettymenu{ public: void changebackground(std::instream & imgsrc); private: Mutex mutex; Image *bgimage; int imagechanges; }; void prettymenu::changebackground(std::istream&imgsrc){ lock(&mutex); delete bgimage; ++imagechanges; bgimage=new image(imgsrc);//这个异常会导致unlock无法调用,资源泄漏;new异常原互斥器没有解锁,然而imagechanges还是++了,但是并没有一个新的image产生,数据被破坏了 unlock(&mutex); } //这个例子没有遵守异常安全的两个条件 //①不泄露任何的资源,②不允许数据的破坏
//unlock的资源泄漏问题可以很容易解决:利用lock class类就能解决,所以把最后一句删除即可。
struct PMImpl{ std::tr1::shared_ptr<image> bgimage; int imagechanges; }; class prettymenu{ public: void changebackground(std::instream & imgsrc); private: Mutex mutex; std::tr1::shared_ptr<PMImpl> pimpl;//防止内存泄漏 }; void prettymenu::changebackground(std::istream&imgsrc){ lock m1(&mutex);//获得mutex的副本数据 str::tr1::shared_ptr<PMImpl> pnew(new PMImpl(*pimpl));// pnew->bgimage.reset(new image(imgsrc));//修改副本 ++pnew->imagechanges; swap(pimpl,pnew);//置换数据,释放mutex }
class person{ public: int age()const{return theage;} private: int theage; };
。
标签:
原文地址:http://www.cnblogs.com/Kobe10/p/5741944.html