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

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83239665

假设我们用一个智能指针指向一个对象:

class SomeObject
{
    void Test();
};
SomeObject *So = new SomeObject;
std::trl::shared_ptr<SomeObject> Ptr(So);

如果存在这么一个API函数,需要SomeObject作为参数:

void SomeApi(SomeObject *So);

那么当你这样调用函数时:

SomeApi(Ptr);

编译器就会报错,因为智能指针类并没有提供隐式转换。

解决方法:

1. 利用智能指针类的接口函数

像auto_ptr和shared_ptr都提供了接口函数,可以得到原始资源:

SomeApi(Ptr.get());
//get会返回原始资源

2. 利用智能指针类中重载的*和->操作符

class SomeObject
{
    void Test();
};
SomeObject *So = new SomeObject;
std::trl::shared_ptr<SomeObject> Ptr(So);
SomeApi((*Ptr)->Test());
SomeApi(Ptr->Test());

3. 提供显示转换函数

考虑下面API:

FontHandle getFont();
void ReleaseFont(FontHandle fh);

我们实现一个类来管理字体资源:

class Font
{
private:
    FontHandle f;
public:
    explicit Font(FontHandle fh): f(fh)
    {}
    ~Font(){releaseFont(f);}
};

我们可以像智能指针一样提供一个get接口:

class Font
{
private:
    FontHandle f;
public:
    FontHandle const Get(){return f;}
    explicit Font(FontHandle fh): f(fh)
    {}
    ~Font(){releaseFont(f);}
};

4. 提供隐式转换函数

class Font
{
private:
    FontHandle f;
public:
    operator FontHandle() const{return f;}//隐式转换函数
    explicit Font(FontHandle fh): f(fh)
    {}
    ~Font(){releaseFont(f);}
};

这样我们调用一个需要FontHandle对象的函数时,可以直接使用Font对象。

void SomeApi(FontHandle f);


Font f(getFont());
SomeApi(f);//隐式转换

个人感觉还是显示转换函数更好一些~~~~~~~~~~

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83239665
今日推荐