我有管理的Win32 C++的RAII類處理使用boost :: shared_ptr的<>,看起來有點像這樣:增加功能的手柄包裝
namespace detail {
struct NoDelete { void operator()(void*) {}; };
}; // namespace detail
template< typename HANDLE_TYPE, typename HANDLE_DELETER >
class CHandleT
{
public :
explicit CHandleT(HANDLE_TYPE handle, bool delete_on_release = true)
{
if(delete_on_release)
handle_ = Handle(handle, HANDLE_DELETER());
else
handle_ = Handle(handle, detail::NoDelete());
};
operator HANDLE_TYPE() const { return static_cast<HANDLE_TYPE>(handle_.get()); };
protected:
typedef boost::shared_ptr<void> Handle;
Handle handle_;
}; // class CHandleT
struct DeallocateHandle
{
void operator()(void* handle) { ::CloseHandle(handle); };
};
typedef CHandleT< HANDLE, DeallocateHandle > CHandle;
我想擴展它這樣,而不是寫:
CHandle my_handle(::CreateEvent(NULL, FALSE, FALSE, NULL));
::SetEvent(my_handle.get());
我可以這樣寫:
CEvent my_event(NULL, FALSE, FALSE, NULL);
my_event.SetEvent();
生活的最好辦法做到這一點爲t o使用CHandle類作爲CEvent類的成員?
class CEvent
{
public:
explicit CEvent(LPSECURITY_ATTRIBUTES lpEventAttributes = NULL,
BOOL bManualReset = TRUE,
BOOL bInitialState = FALSE,
LPCTSTR lpName = NULL,
bool delete_on_release = true) :
handle_(new CHandle(::CreateEvent(lpEventAttributes,
bManualReset,
bInitialState,
lpName),
delete_on_release))
{
};
BOOL SetEvent()
{
_ASSERT(NULL != handle_ && NULL != handle_.get());
return ::SetEvent(handle_.get());
};
private:
boost::shared_ptr<CHandle> handle_;
}; // class CEvent
或者,有沒有更好的方法? (請注意,我仍然希望維持由升壓給出的CHandle的複製語義:: shared_ptr的<>。
感謝, PaulH
+1'DuplicateHandle' – 2009-11-09 21:04:50
@ Majk-a-Ra,爲什麼繼承獲勝?如果他將CHandleT用作「scoped_handle」並且不需要多態性。較少的耦合選項應該是贏家。 – 2009-11-09 22:11:07
它被引用,你提供了正確的關鍵字:組成。相反,混合插入不是耦合。您可以集中更換手柄類型,並做更多。就像標題和模板不耦合。喜歡他們的.cpp的人通常也喜歡遏制:)基於構圖的技術是其中最被低估的技術之一,但是:它在功能性空間中不是問題。面向對象的人們需要更多地質疑,爲什麼不呢。即使在算法中,當然,既沒有用處,也沒有用到,但是用函數形式突出顯示,而不是繼承或包含,不處理多態性。 – 2009-11-09 22:44:10