TL; DR
假设我实现了一个类,该类实现了返回HANDLE
的API。
假设我的班级是HANDLE
的所有者,并负责创建,更新和关闭它。
如何防止API的调用者关闭句柄并破坏设计?
背景CreateToolhelp32Snapshot
是一个昂贵的调用,必须明智地使用。
我的解决方案中有很多项目,每个项目都粗心地调用CreateToolhelp32Snapshot
。
我想实现一个包装类,该类提供对CreateToolhelp32Snapshot
的“智能”访问。
我的课程将是HADNLE
返回的CreateToolhelp32Snapshot
的所有者,并将在需要时进行更新(重新调用CreateToolhelp32Snapshot
)(尚未完全定义何时需要)。
为了简单起见,我们假设我的应用程序是单个进程和线程,而我的类只有一个实例。
最佳答案
假设我实现了一个类,该类实现了返回HANDLE的API
您通过返回手柄破坏了设计。包装器的用户不需要关心句柄,而可以关心他们想要的数据,例如您的案例中的模块列表。公开可以将此类数据返回给用户的API。
class snapshot
{
public:
snapshot()
{
m_handle = CreateToolhelp32Snapshot(...);
}
~snapshot()
{
CloseHandle(m_handle);
}
getModules()
{
// use m_handle to return a list of modules.
}
private:
HANDLE m_handle;
};