单件模式,只创建唯一的一个类实例,构造函数为protected。返回的类实例为一指针,但是如果用户不小心delete这个指针而没办法通知这个单件类,就会引起错误。另外new的这个实例也很容忘记delete造成内存的泄漏。
在这里我采取如下措施来解决上面所提到的问题:
(1)智能指针,将生的实例放到智能指针中,这样就不用内存管理了。
(2)析构函数也声明为protected属性,这样用户就不能delete。
(3)将智能指针声明为单件类的友元。
示例代码如下:
class CRecentClickedButtonSingleton
{
public:
//! 设置这次的键值
/*!
/param const int nCVKValue 本次的击键值
*/
void SetVKValue(const int nCVKValue);
//! 取最近的键值
/*!
/return int 最近键值
*/
inline int GetRecentVKValue();
//! 唯一取实例的入口
/*!
/return CRecentClickedButtonSingleton* 实例对象
*/
static CRecentClickedButtonSingleton* Instance();
//! 判断是否与上次的相同
/*!
/param const int nCVKValue 本次的击键值
/return bool 相同返回true,否则返回false
*/
inline bool IsRecentClick(const int nCVKValue);
friend std::auto_ptr<CRecentClickedButtonSingleton>;
protected:
CRecentClickedButtonSingleton();
~CRecentClickedButtonSingleton(void);
private:
//! 上一次按键值
int m_nVKValue;
//! 关键区
CCriticalSection m_cCritcalSection;
//! 实例
static std::auto_ptr<CRecentClickedButtonSingleton> m_pRecentClickedButton;
};