2011-04-20 4 views
7

값으로 전달 된 핸들에 대한 래퍼 클래스를 작성하는 것은 비교적 쉽습니다. 가장 좋은 방법은 주소로 전달해야하는 핸들을 캡슐화하는 것입니다. QueryServiceConfig (가치에 의해 전달되는 SC_HANDLE처럼 뭔가에 대한 래퍼를 작성하는 예를 들어핸들의 Win API 래퍼 클래스

)는 어렵지 않다. .GetHandle()과 같은 멤버 함수를 구현하거나 operator()을 구현할 수 있습니다.

문제는 (나를 위해 적어도)는 HKEY의 주소를 원하는 RegOpenKeyEx() 같은 API 함수입니다.

나는 오버로드 연산자 &은 일반적으로 좋지 않다는 것을 읽었습니다. 캡슐화 (또는 가능한 한 많이) 및 특히 API 함수 액세스를 허용하면서 리소스 수집을 유지하는 데 권장되는 방법은 무엇입니까?

+0

이러한 경우 나는 Attach() 및 Detach() 모델을 선호한다고 생각합니다. & 연산자를 구현할 수 있지만 큰 추한 것을 알 수 있습니다. 실제로 정답은 없습니다. 그것은 개인적인 취향의 이상입니다. – Luke

답변

2

operator& 및 부적합한 Attach 또는 Detach의 과도한 오버로드를 피하기 위해 항상 다른 인다이 닝 계층을 추가하여 거기에서 미리 포장 된 인스턴스를 반환 할 수 있습니다. 당신은 VS2010 또는 GCC에서 C++ 0X를 사용하거나 std::unique_ptr<>에 접근하는 다른 방법이있을 수있는 경우

것은, 당신이 할 수있는 (에러 것은 간결함을 위해 생략 검사) :

struct hkey_deleter 
{ 
    void operator()(HKEY hkey) 
    { 
     ::RegCloseKey(hkey); 
    } 
}; 

typedef std::unique_ptr<HKEY__, hkey_deleter> regkey; 

regkey MyRegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired) 
{ 
    HKEY hOpenedKey = NULL; 
    ::RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &hOpenedKey); 

    return regkey(hOpenedKey); 
} 

void SomewhereElse() 
{ 
    ... 
    regkey r = MyRegOpenKeyEx(HKEY_CLASSES_ROOT, nullptr, 0, KEY_READ); 
    ... 
} 

하는 hkey_deleter가 있는지 확인합니다 범위가 종료되거나 regkey::reset()이 호출 될 때 레지스트리 키가 닫히는 지 확인하십시오.