1

通常,书籍通常不鼓励在包装 c 结构时使用转换运算符。例如,c++ 字符串(被认为是)是 C 字符数组的包装器,它不提供转换运算符。相反,它给出了方法c_str()

但是,我认真地认为我的情况可能是个例外。我正在总结一个SDL_Surface.Here's class声明。

/** 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*.

你觉得怎么样:

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

2 回答 2

4

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

于 2012-03-12T11:15:43.570 回答
4

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

之所以c_str()存在,是为了让我们 C++ 程序员可以使用std::string并调用所有那些从未听说过的过时的运行时库函数。如果您正在从头开始编写 C++ 程序,那么您的任何函数调用都会采用const char*? 不,他们const std::string&可能会拿一个。

因此,如果您将 SDL 包装在一个不错的库中,那么您必须询问您是否应该公开底层数据结构。当然,您的图书馆总是想与 a 交谈Surface而不关心下面发生了什么?

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

于 2012-03-12T11:17:05.050 回答