單例模式實現
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++教程網