2012-03-12 2 views
1

일반적으로 책에서는 일반적으로 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 기능과 쉽게 호환성을 위해 SDL_Surface*로 변환 연산자를 추가한다고 생각합니다.

여러분의 생각은 :

  1. 것은 변환 연산자는 신중해야겠습니까?
  2. 또는 c_str()과 같은 방법을 사용해야합니까?
  3. 다른 해결책이 있습니까?

답변

4

새로운 변환 된 래퍼 클래스를 기존 SDL 라이브러리 함수에 전달해야 할 변환 연산자를 제공해야하지만 실제로 필요한 경우 스스로에게 질문해야합니다.

c_str()이 전혀 존재하지 않는 이유는 C++ 프로그래머가 std::string을 사용할 수 있기 때문에 결코 들어 본 적이없는 오래된 런타임 라이브러리 함수를 모두 호출 할 수 있기 때문입니다. 처음부터 C++ 프로그램을 작성하고 있다면 함수 호출 중 어떤 것이 const char*이 될까요? 아니요, 그들은 아마도 const std::string& 일 것입니다.

따라서 멋진 라이브러리에 SDL을 래핑하는 경우 이 기본 데이터 구조를 노출해야하는지 물어야합니다. 확실히 당신의 도서관은 언제나 Surface와 대화하고 싶지 않을 것이며 어떤 일이 일어나는지 상관하지 않을 것입니다.

내 선호하는 솔루션은 그것을 숨기고 기본 SDL 라이브러리로 작업하는 클래스를 그렇게하는 것입니다.

+0

+1, 좋은 해결책, 그것은 나를 생각 나게한다 : D. – ApprenticeHacker

4

이상적인 경우 별도의 방법을 제공해야합니다.
변환 연산자의 문제점은 사용하지 않으려는/기대하지 않는 장면에서 암묵적으로 호출 될 수 있다는 것입니다. 특수한 방법을 제공하면 장면 마법처럼 행동 할 수 있습니다.

+0

명시 적 유형 변환이 C++ 11에 도입되었습니다. 이는 유형 변환 연산자를 사용하지 않은 이유를 무효화 할 것 같습니까? – hmjd

+0

@hmjd : 그렇습니다. 그러나 Q는 C++ 11로 태그가 지정되어 있지 않으므로 OP가 C++ 03에서 작동한다고 가정합니다. –

+0

Als, 나는 그것이 C++ 11 태그가 없다는 것을 안다. 내가 믿기를 원하는지 확인하고 싶었습니다. 건배. – hmjd

관련 문제