让资源管理类提供原始资源指针的访问接口
理想情况下,所有资源相关的操作全部通过资源管理类来进行,非必要不要暴露原始资源的指针。但是对于一些已经存在的老接口,他的入参要求是个资源指针,这种情况下为了适配它,就不嘚不提供一个获取资源指针的接口。之前提到过。尽量用auto_ptr 和shared_ptr来维护资源。有两种方式来实现资源管理类与其包含资源指针的转换。一种是显示转换,一种是隐式转换。
显示转换
auto_ptr shared_ptr 都提供了get成员函数用于返回原始资源指针。
举个例子:
void myDeleteSrc(char* pSrc)
{
delete[] pSrc;
}
std::shared_ptr<char> createRes()
{
std::shared_ptr<char> ret (new char[1024],myDeleteSrc);
return ret;
}
void setSrc(char* pSrc)
{
pSrc[0] = 'a';
}
int main()
{
auto pSrc = createRes();
setSrc(pSrc.get());
}
在这个例子中为了兼容老接口setSrc(), 就不得不掉用资源管理类的get函数来获取原始资源指针。
隐式转换
智能指针类并没有提供隐式转换的能力。比如下面的代码,在编译期间就会报错. 因为智能指针对象pSrc不能自动转换成char*类型。
void setSrc(char* pSrcChar);
std::shared_ptr<char> pSrc(new char);
setSrc(pSrc);
如果需要资源管理类能够支持隐式转换,那么还需要编写隐式转换相关的代码。隐式转换的实现用(item15)的扩展章节说明.
网友评论