我有管理的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