版权声明:转载请注明出处,谢谢!!! 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);//隐式转换
个人感觉还是显示转换函数更好一些~~~~~~~~~~