《Effective C++》学习笔记条款15 在资源管理类中提供对原始资源的访问

来源:互联网 发布:医院网络客服工资高吗 编辑:程序博客网 时间:2024/06/10 17:50

条款15:在资源管理类中提供对原始资源的访问

        前几个条款提到的资源管理类很棒。它们是你对抗资源泄漏的堡垒。但这个世界并不完美,许多APIs直接指涉资

源,这时候我们需要直接访问原始资源。
       

      这时候需要一个函数可将RAII对象(如tr1::shared_ptr)转换为其所内含之原始资源。有两种做法可以达成目

标:显示转换隐式转换
    

       tr1::shared_ptrauto_ptr都提供一个get成员函数,用来执行显示转换,也就是返回智能指针内部的原始指针

(的复件)。就像所有智能指针一样, tr1::shared_ptrauto_ptr也重载了指针取值操作(operator>operator*),

它们允许隐式转换至底部原始指针。(即在对智能指针对象实施->*操作时,实际被转换为被封装的资源的指针。)
   
 

class Font 
    {
        public:
 
        ...
 
       FontHandle get() const        //FontHandle是资源;    显示转换函数
       { 
           return f; 
       }
       
 operator FontHandle() const        //隐式转换    这个值得注意,可能引起“非故意之类型转换”
       { 
           return f; 
       } 
        ...
 
    };
 
   

       是否该提供一个显示转换函数(例如get成员函数)将RAII类转换为其底部资源,或是应该提供隐式转换,答案主

要取决于RAII类被设计执行的特定工作,以及它被使用的情况。

    

      显示转换可能是比较受欢迎的路子,但是需要不停的getget;而隐式转换又可能引起非故意之类型转换
   
 

请记住:

        APIs往往要求访问原始资源,所以每一个RAII类应该提供一个“取得其所管理之资源”的方法。

         

         对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。 

1 0
原创粉丝点击