Действителен ли в этом случае оператор преобразования? - PullRequest
1 голос
/ 12 марта 2012

Как правило, в книгах не рекомендуется использовать операторы преобразования при упаковке структур. Например, строка c ++, которая (как считается) является оболочкой массива C char, не предоставляет оператора преобразования. Вместо этого он дает метод 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. Или есть другое, лучшее решение?

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

Хотя для передачи вашего новомодного класса-обертки в существующие функции библиотеки SDL потребуется предоставление оператора преобразования, вы должны спросить себя, действительно ли вам это нужно.

Причина, по которой c_str() существует вообщеЭто так, что наши программисты на C ++ могут использовать std::string и затем вызывать все те архаичные функции библиотеки времени выполнения, которые никогда о ней не слышали.Если вы пишете программу на C ++ с нуля, будет ли какой-либо из ваших вызовов функций принимать const char*?Нет, они бы взяли const std::string&, возможно.

Итак, если вы заключаете SDL в хорошую библиотеку, тогда нужно спросить, должны ли вы когда-либо раскрывать основную информациюструктуры данных.Конечно, вашей библиотеке всегда захочется поговорить с Surface, и не волнует, что происходит под ней?

Так что мое предпочтительное решение было бы скрыть это и позволить тем классам, которые имеют дело с работой с базовым SDLбиблиотека, сделай так.

4 голосов
/ 12 марта 2012

В идеале, Вы должны предоставить отдельный метод.
Проблема с оператором преобразования заключается в том, что он может вызываться неявно за кулисами, где вы не хотите / не ожидаете его использования. Предоставление специального метода защищает вас от этой магической сцены.

...