单例模式实现
boost::noncopyable 防止复制,如果是自己实现,那要把构造函数、拷贝构造,复制构造都私有
公有方法:
获取单例对象:instance() 返回 value 引用,(第一次 -->pthread_once --> init )
私有:
初始化new一单例:init()--并 atexit 注册销毁函数释放delete value
构造函数、拷贝构造,复制构造
析构函数
静态实际对象vaue指针,静态pthread_once_t
1.空用一个变量tt,声明了变量但是没有使用 编译时加 Wno-unused-parameter,会报错
(void) tt;
2.防止delete一个不完全对象
//typedef定义一个char数组类型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只声明没有定义-不完全类型, 没定义就没有析构函数,delete就不会调用析构函数了; char[1]--T是完全类型,即有定义,delete操作,可以调用析构函数
typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];
//下面两句主要是防止报错,Werror=unused-local-typedefs,Wno-unused-parameter
T_must_be_complete_type tt;
(void)tt;
#ifndef MUDUO_BASE_SINGLETION_h
#define MUDUO_BASE_SINGLETION_h
#include <boost/noncopyable.hpp>
#include <pthread.h>
#include <stdlib.h> //atexit
namespace muduo
{
template<typename T>
class Singleton : boost::noncopyable
{
public:
static T& instance()
{
pthread_once( &ponce_, Singleton::init );
return *value_;
}
private:
Singleton();
~Singleton();
static void init()
{
value_ = new T();
atexit(destroy);
}
static void destroy()
{
//定义一个char数组类型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只声明没有定义-不完全类型 ; char[1]--T是完全类型,即有定义,delete操作,可以调用析构函数,没定义就没有析构函数,delete就不会调用析构函数了
typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];
T_must_be_complete_type tt;
(void)tt;
delete value_;
}
private:
static pthread_once_t ponce_; //但是,只有一份,所以要静态!!
static T* value_; //要静态!!
};
template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;
template<typename T>
T* Singleton<T>::value_ = NULL;
}
参考:c++教程网