重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

C++单例模式-创新互联

1.
//singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H

template 
class 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
#include 
using 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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:C++单例模式-创新互联
文章源于:http://cqcxhl.com/article/dcjdis.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP