通常,书籍通常不鼓励在包装c结构时使用转换运算符。例如,(被认为是)C char数组的包装器的c ++字符串不提供转换运算符。相反,它给出了方法c_str()
。
但是,我认真地认为我的情况可能是例外。我正在收尾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()
这样的方法吗?答案 0 :(得分:4)
理想情况下,您应该提供单独的方法 转换运算符的问题在于它可能会在您不希望/期望使用它的场景后隐式调用。提供一种特殊的方法可以保护你免受这种场景的影响。
答案 1 :(得分:4)
虽然提供转换运算符需要将新的包装类传递给现有的SDL库函数,但您必须问问自己是否真的需要。
c_str()
存在的原因是我们C ++程序员可以使用std::string
然后调用那些从未听说过它的古老的运行时库函数。如果您是从头开始编写C ++程序,那么您的任何函数调用都会使用const char*
吗?不,他们可能会选择const std::string&
。
因此,如果你将SDL包装在一个很好的库中,那么必须要问你是否曾暴露底层数据结构。当然,你的图书馆总是希望与Surface
交谈而不关心下面发生了什么?
因此,我首选的解决方案是隐藏它,让那些处理底层SDL库的类这样做。