1

通常、本は通常、c構造体をまとめるときに変換演算子の使用を推奨していません。たとえば、C文字列のラッパーである(と思われる)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関数との互換性を容易にするために、に変換演算子を追加する必要があると真剣に考えています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 に答える