boost::serialization::singleton单例的使用方式

来源:互联网 发布:c语言编程需要什么软件 编辑:程序博客网 时间:2024/05/17 08:29
#include "stdafx.h"#include <boost/noncopyable.hpp>#include <boost/serialization/singleton.hpp>#include <iostream>// 使用方式1:模板参数方式class CTest:public boost::noncopyable // 不能复制、赋值{public:void Set(int i){ m_val = i; }void Print() const{ std::cout<<m_val<<std::endl;}private:int m_val;};// 使用typedef以及宏来简化使用typedef boost::serialization::singleton<CTest> singleton_ctest; // 使用模板的方式只允许单个实例#define sCTest singleton_ctest::get_mutable_instance() // 非const实例#define sCTest_const singleton_ctest::get_const_instance() // const实例// 使用方式2:继承方式class CDerived:public boost::serialization::singleton<CDerived> // 只允许单个实例,不能复制、赋值(基类派生自boost::noncopyable){public:void Set(int i){ m_val = i; }void Print() const{ std::cout<<m_val<<std::endl;}private:int m_val;};#define sCDerived CDerived::get_mutable_instance() // 非const实例#define sCDerived_const CDerived::get_const_instance() // const实例int _tmain(int argc, _TCHAR* argv[]){// singleton_ctest obj1;// singleton_ctest obj2;sCTest.Set(10);sCTest_const.Print(); // 10// 操作类的非static成员CDerived cobj;CDerived cobj2;cobj2.Set(89);cobj.Set(10);// 单例的概念:并非是不能定义两个类对象本身// 而是当有多个对象时,通过boost提供的静态成员函数get_mutable_instance()返回实例再调用普通成员函数之后,// 类对象的结果保持一致,就好像类中的所有数据成员都是static一样// 这时的类好像定义了两种同名的数据成员以及成员函数:static与非static// 非static由普通方式调用:即先定义类对象,再调用成员函数// static先调用由boost提供的get_mutable_instance()(或get_const_instance())再调用成员函数的方式// 从而保证单例(因为类的所有成员共享static)// 两种调用互不影响(各自数据成员是分离的),唯一的影响是类现在派生自boost::noncopyable//操作类的“static成员”CDerived::get_mutable_instance().Set(20);CDerived::get_mutable_instance().Print(); // 20// same way:sCDerived.Set(20); sCDerived.Print();  // 20/*sCDerived_const.Set(89); // error*/sCDerived_const.Print(); // 20cobj2.get_mutable_instance().Print(); // 20cobj.get_mutable_instance().Print(); // 20// 操作类的非static成员cobj2.Print(); // 89cobj.Print(); // 10// 实际使用中,我们没有必要也不应该直接定义类对象,而是应该总是通过使用类的static成员函数:// classname::get_mutable_instance().memberFunction(para);(或get_const_instance())来确保“单个实例”// 本例中定义的宏的使用方式与类对象的使用方式相同:name.member_function(para);// 可以将宏当做“对象”return 0;}

0 0
原创粉丝点击