2015-07-20 12 views
5

Zauważyłem, że wiele klas Poco ma chroniony destruktor. To sprawia, że ​​irytowanie kodu jest bardziej irytujące. Na przykład tutaj jest część mojego kodu:Uzasadnienie dla chronionego destruktora

struct W2: Poco::Util::WinRegistryConfiguration 
{ 
    typedef Poco::Util::WinRegistryConfiguration inherited; 
    using inherited::inherited; 
}; 

std::string get_documents_folder() 
{ 
    W2 regc { "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" }; 
    return regc.getString("Personal", ""); 
} 

Oczywiście, byłoby znacznie prostsze, czy mogę pozbyć się W2 i po prostu zrobić regc mieć typ WinRegistryConfiguration. Ale nie jest to możliwe z powodu chronionego destruktora.

Rozumiem, że można zamiast tego używać Poco::AutoPtr, ale zasoby są marnowane, wykonując alokację dynamiczną z new, gdy automatyczne przydzielanie powinno działać poprawnie.

Moje pytanie brzmi: jakie jest tego uzasadnienie i czy nie mam nic do powiedzenia?

Odpowiedz

0

Jak już udzielono odpowiedzi, Poco :: RefCountedObject ma chroniony destruktor, więc nie można tworzyć na nim wszystkich klas dziedziczących z niego. Powodem jest to, że same usuwają się, gdy licznik odwołań osiąga zero, więc tworzenie ich na stosie powodowałoby niezdefiniowane zachowanie - są one przeznaczone głównie do użycia z Poco :: AutoPtr, ale nie jest to obowiązkowe - można również odwoływać się do liczby ręcznie, używając duplicate() i release().

Patrząc na kod, jesteś prawdopodobnie szuka WinRegistryKey, których można używać tak:

std::string get_documents_folder() 
{ 
    Poco::Util::WinRegistryKey regKey("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); 
    return regKey.getString("Personal", ""); 
} 
1

Powodem jest to, że WinRegistryConfiguration jest liczony odwołanie (dziedziczenie z Poco :: RefCountedObject). Chroniony destruktor ma na celu uniemożliwienie klientowi instancji klasy na stosie lub bezpośrednie usunięcie obiektu. Zamiast tego należy utworzyć instancję klasy przez new i zarządzać czasem życia za pomocą metod RefCountedObject.

Nie jestem zaznajomiony z Poco, ale powinna istnieć również klasa inteligentnego wskaźnika, która zarządza obiektami zliczanymi referencyjnie, automatycznie wywołując metody RefCountedObject.

Powiązane problemy