通常,书籍在包装c结构时通常不鼓励使用转换运算符。例如,c++字符串(被认为是)c字符数组的包装器,它不提供转换运算符。相反,它给出了方法CCD_ 1。
然而,我真的认为我的情况可能是个例外。我正在结束一个SDL_Surface.
。这是类声明。
/** Wraps up SDL_Surface **/
class surface
{
SDL_Surface* _surf;
public:
/** calls SDL_LockSurface().
** throws surface_lock_exception on failure.
**/
void lock();
/** calls SDL_UnlockSurface() **/
void unlock();
/** calls SDL_LoadBMP().
** throws image_load_exception on failure.
**/
void load_bmp(const string&);
/** calls SDL_FreeSurface(). **/
void free();
/** destructor. Also free()s the internal SDL_Surface. **/
~surface();
};
在这种情况下,我认真地认为我应该向SDL_Surface*
添加一个转换运算符,以便与其他需要SDL_Surface*
的SDL函数轻松兼容。
你怎么看:
- 转换操作员会谨慎吗
- 或者我应该使用类似
c_str()
的方法吗 - 或者还有其他更好的解决方案吗
尽管需要提供一个转换运算符才能将新的包装类传递给现有的SDL库函数,但您必须问问自己是否真的需要。
c_str()
存在的原因是,我们C++程序员可以使用std::string
,然后调用所有从未听说过的过时的运行库函数。如果你从头开始编写C++程序,你的任何函数调用都会使用const char*
吗?不,他们可能要const std::string&
。
因此,如果您将SDL封装在一个漂亮的库中,那么必须询问是否应该公开底层数据结构。你的图书馆肯定总是想和c_str()
0交谈,而不在乎下面发生了什么?
因此,我的首选解决方案是将其隐藏起来,并让那些处理底层SDL库的类这样做。
理想情况下,您应该提供一个单独的方法
转换运算符的问题在于,在您不希望/期望使用它的情况下,它可能会在幕后被隐式调用。提供一种特殊的方法可以保护你免受这种幕后魔法的影响。