Effective C++——》条款15:在资源类管理类中提供对原始资源的访问
来源:互联网 发布:大数据数据分析论文 编辑:程序博客网 时间:2024/06/07 02:00
1 void PrintIntPointerValue(int* p) 2 { 3 cout << *p << endl; 4 } 5 6 int main() 7 { 8 MySharedPtr<int> ptr(new int(2)); 9 PrintIntPointerValue(ptr);10 }
因为PrintIntPointerValue函数需要原始指针,但MySharedPtr类中并没有提供这一个接口,所以如果像上面程序一样强行使用,就会报编译错,
解决的方法其实挺简单的,就是在类中添加一个名为get()的函数,这个函数返回原始指针。也许会有人质疑这种做法,因为这样原始指针的阴影又会浮现出来,它提供了一个让用户可能出错的接口。
但书上有句话说的好:一个好的class应是“隐藏了客户不需要看的部分,但备妥客户需要的所有东西”。
除了get()外,也可以使用隐式转换函数:
1 operator T*() const2 {3 return ptr;4 }
但这种方法往往会使程序陷入漏洞之中,比如:
MySharedPtr<int> sharedPtr(new int(3));
int *ordinaryPtr = sharedPtr; // 这样编译会通过,但一旦sharedPtr释放资源后,ordinaryPtr便会成为悬空指针(ordinaryPtr并会使引用计数加一,也不会参与到资源释放的操作中来)
所以一般而言,提供一个get()函数是比较好的选择。另外,为了方便访问,还应该重载*和->操作符,使得MySharedPtr对象的操作与原始指针的操作一样方便,如下所示:
1 T& operator* () const 2 { 3 return *ptr; 4 } 5 6 T* operator-> () const 7 { 8 return ptr; 9 }10 11 T* get() const 12 {13 return ptr;14 }
- 一些应用程序接口往往要求访问到原始资源,所以每一个RAII类都应该提供一个“取得所管理之资源”的方法
- 对原始资源的访问可能经由显式或隐式转换。一般而言显式转换比较安全(用get而不用operator T*())
0 0
- Effective C++——》条款15:在资源类管理类中提供对原始资源的访问
- 【Effective c++】条款15:在资源管理类中提供对原始资源的访问
- 《Effective C++》学习笔记条款15 在资源管理类中提供对原始资源的访问
- 读书笔记《Effective C++》条款15:在资源管理类中提供对原始资源的访问
- Effective C++:条款15:在资源管理类提供对原始资源的访问
- Effective C++(15) 在资源管理类中提供对原始资源的访问
- C++之在资源管理类中提供对原始资源的访问(15)---《Effective C++》
- Effective C++ 条款15学习笔记:在资源管理类型中提供对原始资源的访问
- 条款15: 在资源管理类中提供对原始资源的访问
- 条款15、在资源管理类中提供对原始资源的访问
- 条款15: 在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- 条款15 在资源管理类中提供对原始资源的访问
- 条款15 在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- 条款15 在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- Python学习笔记(1)变量、循环
- Python学习笔记(2)比特操作、类、文件操作
- golang 日期格式化的意义
- Makefile 中:= ?= += =的区别
- 擅长排列的小明
- Effective C++——》条款15:在资源类管理类中提供对原始资源的访问
- MySQL 用户管理
- MySQL存储过程和函数
- 浅析MySQL索引
- SQL Union和SQL Union All用法
- 01.流程结构
- 浅谈MySQL的存储引擎
- 02.函数和指针
- MySQL 中LIMIT用法