转换运算符在这种情况下有效吗



通常,书籍在包装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函数轻松兼容。

你怎么看:

  1. 转换操作员会谨慎吗
  2. 或者我应该使用类似c_str()的方法吗
  3. 或者还有其他更好的解决方案吗

尽管需要提供一个转换运算符才能将新的包装类传递给现有的SDL库函数,但您必须问问自己是否真的需要。

c_str()存在的原因是,我们C++程序员可以使用std::string,然后调用所有从未听说过的过时的运行库函数。如果你从头开始编写C++程序,你的任何函数调用都会使用const char*吗?不,他们可能要const std::string&

因此,如果您将SDL封装在一个漂亮的库中,那么必须询问是否应该公开底层数据结构。你的图书馆肯定总是想和c_str()0交谈,而不在乎下面发生了什么?

因此,我的首选解决方案是将其隐藏起来,并让那些处理底层SDL库的类这样做。

理想情况下,您应该提供一个单独的方法
转换运算符的问题在于,在您不希望/期望使用它的情况下,它可能会在幕后被隐式调用。提供一种特殊的方法可以保护你免受这种幕后魔法的影响。

最新更新