#pragma once
#include "Base/Noncopyable.h"
#include
namespace Base
{ using namespace std;
/** @class * @brief 设计模式的单件模式,用来取代全局变量 * * 全局只有一份内存,当需要使用的时候才被分配内存 * 使用的时候通过函数Instance()获取对象的引用 * * 单件模式,基类使用的模型 *
class MyClass : public CSingleton*
{ * friend class CSingleton; * private: * MyClass() {} * public: * ... * }; */ //!! PCLint [error 1509: (Warning -- base class destructor for class 'CSingleton' is not virtual)] //lint -esym(1509, CSingleton) templateclass CSingleton : private CNoncopyable { public: // 访问单件的唯一方式 static T& Instance(); protected: CSingleton() {} }; /** @fnT& CSingleton::Instance() * @brief获取实例的接口 * @paramvoid * @returnT& 对象的引用 */ templateinline T& CSingleton::Instance() { static auto_ptrs_instance; static boost::mutex mutex; if (s_instance.get() == NULL) { boost::unique_locklock(mutex); //! 加锁避免同时被创建两个实例 //! CSingleton作用域下互斥量,不需要担心不同类型之间的互斥 if (s_instance.get() == NULL) // 第二次判断的目的在于不被多线程重复创建 { s_instance = auto_ptr(new T); } } return *s_instance.get(); } }
#pragma once #include "Base/Global.h" namespace Base { /** @class * @brief 禁止拷贝和拷贝构造 * * 子类使用的模型 * class Foo : private CNoncopyable * { * ... * }; */ //!! PCLint [error 1509: (Warning -- base class destructor for class 'CNoncopyable' is not virtual)] //lint -esym(1509, CNoncopyable) class BASE_LIB_EXPORT CNoncopyable { protected: CNoncopyable() {} ~CNoncopyable() {} private: // 将拷贝构造和赋值操作符声明为私有类型 CNoncopyable(const CNoncopyable&) = delete; const CNoncopyable& operator= (const CNoncopyable&) = delete; }; }