2011-04-20 41 views
7

Yalnızca değer tarafından geçirilen bir tanıtıcı için bir sarıcı sınıfı yazmak nispeten kolaydır. Adres tarafından geçirilmesi gereken tutamaçları en iyi şekilde tutmanın ne olduğunu belirlemeye çalışıyorum. QueryServiceConfig (değeriyle geçirilen SC_HANDLE gibi bir şey için bir sarıcı yazma ÖrneğinSatırlar için API API sarıcı sınıfları kazanma

) zor değildir. Biri, .GetHandle() gibi bir üye işlevini uygulayabilir veya operatörünü() uygulayabilir.

sorunu (benim için en azından) bir HKEY adresini istiyor RegOpenKeyEx() gibi API işlevleri.

Bu aşırı yükleme işleci & genel olarak kötü bir fikir olduğunu okudum. Kapsüllemeyi (veya mümkün olduğu kadar) ve özellikle API işlevlerine erişirken özellikle kaynak koleksiyonunu tutmanın önerilen yolu nedir?

+0

Bunlar gibi durumlarda Attach() ve Detach() modelini tercih ederim. Bir & operatörünü uygulayabilirsiniz, ancak büyük bir çirkin buluyorum. Gerçekten doğru bir cevap yok; daha çok kişisel bir tercih. – Luke

cevap

2

Hep operator& ve çirkin Attach veya Detach korkunç aşırı yüklenmesini önlemek ve oradan önceden sarılmış bir örneğini döndürmek için dolaylama başka bir katman ekleyebilir. Eğer VS2010 veya gcc C++ 0x kullanabilir veya std::unique_ptr<> erişen başka yollarla Eğer

, o zaman bunu yapabilirsiniz (hata kısaca geçilmiştir Kontrolden):

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 sağlayacağız kapsam kaldırıldığında veya regkey::reset() çağrıldığında kayıt defteri anahtarının kapanacağı.