转换运算符在这种情况下是否有效?

时间:2012-03-12 11:13:02

标签: c++ oop operator-keyword conversion-operator

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

您如何看待:

  1. 转换运营商会谨慎吗?
  2. 或者我应该使用像c_str()这样的方法吗?
  3. 还是有另一种更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

因此,如果你将SDL包装在一个很好的库中,那么必须要问你是否暴露底层数据结构。当然,你的图书馆总是希望与Surface交谈而不关心下面发生了什么?

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