《Effective C++》条款15:使用资源管理类提供对原始资源的访问

一直觉得可能这种方法破坏了对于原始资源的封装性,但是书上的一句话说的特别好:资源管理类并不是为了封装而存在的,是为了delete而存在的;

所以,返回原始资源的访问,并不算破坏封装性;

 

原始资源的使用往往和C API接口有关,所以本章节给出了几个例子,如何返回原始资源;

 

针对于智能指针而言:

Investment* createInvestment();

auto_ptr<Investment> pInv(createInvestment());

Investment* ppInv = pInv.get();

使用auto_ptr的get()函数可以有效地得到初始资源;

shared_ptr同理,可以根据函数进行不同的操作;

 

针对于显式直接返回而言:

如下所示,直接设置一个函数返回最初资源即可:

class Font {
public:
	explicit Font(Investment Inv) :INV(Inv) {};
	~Font(){
		//release Font;
	}
	Investment get() const {
		return INV;
	}
private:
	Investment INV;
};

 

针对于隐式转换而言:

这种形式比较少见,意在当遇到类型不匹配时,由编译器自己进行类型转换,无需调用其他函数;

class Font {
public:
	explicit Font(Investment Inv) :INV(Inv) {};
	~Font(){
		//release Font;
	}
	operator Investment() const {
		return INV;
	}
private:
	Investment INV;
};

这里注意下隐式转化的写法;

 

对于显式和隐式各有优劣:

显式可以很好的避免隐式类型转化而引起的未知错误,清晰,但是用户调用麻烦;

隐式调用方便,但是容易造成不注意隐式转换而带来的错误;

posted @ 2020-12-07 17:19  暮云林凌  阅读(74)  评论(0)    收藏  举报