EffectiveC++条款29的理解
本次主要对p131的代码进行分析,还是对pimpl手法——以指针指向一个对象,内含真正数据,这种手法的理解
代码本体
struct PMImpl //PMImpl="pretty menu Impl"
{
std::tr1::shared_ptr<Image> bgImage;
int imageChanges;
};
class PrettyMenu
{
...
private:
Mutex mutex;
std::tr1::shred_ptr<PMImpl> pImpl;
};
void PrettyMenu::changeBackground(std::istream& imgSrc)
{
using std::swap;
Lock ml(&mutex);
std::tr1::shared_ptr<PMImpl> pNew(new PMImpl(*pImpl));
pNew->bgImage.reset(new Image(imgSrc));//修改副本
++pNew->imageChanges;
swap(pImpl,pNew);
}
函数理解
std::tr1::shared_ptr<PMImpl> pNew(new PMImpl(*pImpl));
这段代码的意思是
- 建立一个智能指针pNew,pNew指向的对象的类型是PMImpl
- new出一个PMImpl类对象的空间,使用*pImpl的内容复制初始化,new返回一个地址给pNew
- 现在pNew指向一块内容,这块内容和*pImpl的内容完全一样,是一块“副本”
++pNew->imageChanges
对副本进行修改,++是作用在imageChanges上的,不是作用在pNew上的。