单例介绍
- 单例模式不能用静态成员对象来实现,而只能用静态成员的指针来实现,因为项目大的时候会有很多单例,静态对象无法保证初始化次序,有可能会导致运行时错误(用的时候还没实例化)。
- 为了防止用户有其他途径意外创建对象,默认构造函数、复制构造函数应该声明为私有。noncopyable
- boost提供了非线程安全的实现,可以直接使用
- 线程安全的目前还没有
非线程安全的Boost单例实现:
#include<iostream>
using namespace std;
#include "boost/serialization/singleton.hpp"
using namespace boost::serialization;
class A
{
public:
A(void){cout<<"A()"<<endl;}
~A(void){cout<<"~A()"<<endl;}
void print(void)const {cout<<"A::print()"<<endl;}
};
class B
{
public:
B(void){cout<<"B()"<<endl;}
~B(void){cout<<"~B()"<<endl;}
void print(void)const
{
singleton<A>::get_mutable_instance().print();//获取非const实例,非线程安全的
}
};
void global_print(void)
{
singleton<A>::get_const_instance().print();//获取const实例,线程安全的
}
int main(int,char**)
{
singleton<A>::get_const_instance().print();//获取const实例,线程安全的
global_print();
B b;
b.print();
return 0;
};
运行结果:
A()
A::print()
A::print()
B()
A::print()
~B()
~A()
请按任意键继续. . .
线程安全的单利: