2011-02-27 4 views
2

다음 코드 스 니펫을 보았습니다.사용자 정의 연산자를 호출하는 방법?

class WindowHandle { 
public: 
    WindowHandle(WINDOW_HANDLE handle) : w(handle) {} 
    ~WindowHandle() { destoryWindow(w); } 

    operator WINDOW_HANDLE() { return w; } 
    ... 

private: 
    WINDOW_HANDLE w; 
    ... 
} 

다음은 질문입니다. WINDOW_HANDLE() 연산자를 사용하여 원시 포인터를 얻는 방법은 무엇입니까? 내 추측을 다음과 같이 나열합니다.

WindowHandle win(createWindow()); 

WINDOW_HANDLE winPtr = win.operator WINDOW_HANDLE(); // I am not sure whether this is correct. 

+0

코드가 유효합니까? C++입니까? –

+0

@ alpha123 - 형식의 매크로가있는 캐스트 연산자처럼 보입니다 ... – Flexo

+0

WINDOW_HANDLE winPtr = win.operator WINDOW_HANDLE()을 작성하고이 사용자 정의 연산자를 사용하는 방법을 알아 내려고 시도합니다. – q0987

답변

6

단순히

WINDOW_HANDLE winPtr = win; 

충분 :

WindowHandle win(createWindow()); 

WINDOW_HANDLE winPtr = win.operator WINDOW_HANDLE(); // I am not sure whether this is correct. 

그것은 당신이 캐스팅 할 수 있습니다

+0

Hello Ben, WindowHandle 클래스가 둘 이상의 사용자 정의 연산자를 정의하고 컴파일러가 어느 것을 선택해야하는지 어떻게 알 수 있습니까? - 고마워요 – q0987

+1

@ q0987 : 이것은 C++에서 과부하 해결에서 반환 유형을 사용하는 유일한 경우입니다. –

+0

@ q0987 - 할당/변환에 적합한 하나를 선택합니다. – Flexo

3

주셔서 감사합니다 다음과 같이 나는 내 생각을 나열합니다. 사용자 정의 연산자는 암시 적 변환을 작성합니다.

+2

캐스트가 필요하지 않을 때는 사용하지 마십시오. 잘못된 것을 수행하면 컴파일러가 경고를하지 않습니다. 캐스트가 있거나없는 경고는 여기에 없습니다. –

+0

와우, 나는 이것이 내 대답이어야한다고 생각한다. – q0987

+0

@ 벤, 당신은 절대적으로 옳습니다. 저자는이 코드를 피해야합니다. - 고마워요 – q0987

0

보여주는 코드의 목적은 핸들을 자동으로 닫는 것입니다. 따라서 WINDOW_HANDLE을 생성하고 그것을 래퍼 클래스에 넣으면 호출이 닫힙니다.

주된 문제는 암시 적 생성자가 있고 오버로드 된 복사 생성자 또는 할당 연산자가 없으며 소멸자가 핸들을 파괴한다는 것입니다.

따라서 구현과 관련하여 문제가 발생할 수 있습니다.

연산자 WINDOW_HANDLE (합법적 인 ThiefMaster, 암시 적 변환)의 목적은 사용자가 실제로 WINDOW_HANDLE이 필요한 함수에 WindowHandle을 전달할 수있게하는 것입니다. 변환은 const 메소드 여야합니다. 결국 참조를 전달하지 않습니다.

언어가 이러한 기능을 제공했지만 사용하지 않는 것이 좋습니다. get() 방법이 바람직하다.

복사 할 필요가없는 경우 boost::unique_ptr을 사용할 수 있으므로이 코드를 작성할 필요가 없으며 그렇게 할 경우 boost :: shared_ptr을 사용할 필요가 없으며 어떤 경우에도 deleter 함수로 만들 수 있습니다 ,이 경우 DestroyWindow

+0

당신은 복사 생성자와 대입 연산자에 대해 확실히 옳습니다. OTOH는 스코어 메이어 (Scott Meyer)의 코드 스 니펫을 사용하고 있다고 언급했는데 세 사람의 규칙을 분명히 알고 있으므로 줄임표에 숨겨진 것으로 의심됩니다. 포함 된 값이 포인터 유형이 아니기 때문에 스마트 포인터 클래스가 어떻게 처리 할지는 모르겠다. 그래서 템플릿 실제 매개 변수에 대해 무엇을 선택하겠습니까? –

관련 문제