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

Provide access to raw resources in resource-managing classes.

由于许多 APIs 直接指涉资源,例如:

std::tr1::shared_ptr<Investment> pInv(new Investment());
int deysHeld(const Investment* pi);

所以资源管理类需要提供对原始资源的访问接口。引用计数型智慧指针和智能指针都提供一个 get() 成员函数,用来执行显示转换,它会返回智能指针内部的原始指针;并且也重载了指针取值(pointer dereferencing)和操作符(operator-> 和 operator*),它们允许转换至底部原始指针。

对于自定义的资源管理类,可以选择显式转换函数和隐式转换函数两种方式:

class Font {
public:
    ...
    FontHandle get() const { return f; }        // 显式转换;
    operator FontHandle() const { return f; }   // 隐式转换;
private:
    FontHandle f;
};

// 隐式转换会增加错误发生的概率;
Font f1(new FontHandle();
FontHandle f2 = f1;    // 原意是要拷贝一个 Font 对象;

一般而言显式转换比较安全,但隐式对客户比较方便。

Last updated

Was this helpful?