C++单例模式
1. //singleton.h #ifndef SINGLETON_H #define SINGLETON_H templateclass singleton { public: static T* get_instance(); private: // static instance 的作用,主要是为了让所有的 单例 都在main 执行前, //或者so加载成功时,调用其构造函数 class creator { public: creator() { get_instance(); } inline void dono()const{} }; static creator instance; }; //模板内嵌套类,需要用typename告知其是类型 template typename singleton ::creator singleton ::instance; template T* singleton ::get_instance() { static T t; instance.dono(); return &t; } #endif
#ifndef TESTC_H #define TESTC_H #includeusing namespace std; class testc { public: ~testc(){cout<<"~test"< #include "singleton.h" #include "testc.h" int main() { testc * cc=singleton::get_instance(); cc->init(1); cout< m< ::get_instance(); cc2->init(2); cout< m< init(3); cout< m< testc is called init is called 1 1 testc is called init is called 3 ~test 2.跨so 单例模板 会产生多实例问题 问题初步原因: 不同so中会对 类模板进行实例化,并在不同so中各存在 一个类副本。网上有人确认过,singleton 产生的类A代码,在不同so中 typeid(singleton) 的返回值 type_info 不相等,但我自己确认结果是 两者相等。 解决方法: 想办法,让单例类的实例化 singleton 只在一个so中进行; class A { ... A* get_instance(){return singleton::get_instance();} ... }; 想获得单例时 执行 A::get_instance(),而非 singleton::get_instance(); 在这里:testc 类会被 两个不同的so liba.so,libb.so 使用其单例,如果按照1中的方法,则 在liba.so 和libb.so中都会 调用 singleton::get_instance(),但因为 liba.so ,libb.so 是不同的编译单元, 编译器会 为两个 so产生 两份类 testc 单例化的副本。(后续在好好梳理) 解决方法 #ifndef TESTC_H #define TESTC_H #include using namespace std; class testc { public: ~testc(){cout<<"~test"< ::get_instance()} bool init(int mm) { if(hasinit) return true; m=mm; cout<<"init is called"< 参考文献,感谢两位博主,
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、策勒网站维护、网站推广。
http://blog.cnbang.net/tech/2229/
http://blog.csdn.net/crayondeng/article/details/24853471
http://blog.csdn.net/fullsail/article/details/8483106
当前名称:C++单例模式
链接地址:http://ybzwz.com/article/ihjesd.html