真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++單例模式

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

template 
class singleton
{
public:
    static T* get_instance();
private:
        // static instance 的作用,主要是為了讓所有的 單例 都在main 執(zhí)行前,
        //或者so加載成功時(shí),調(diào)用其構(gòu)造函數(shù)
    class creator
    {   
        public:
        creator()
        {   
            get_instance();
        }   
        inline void dono()const{}
    };  
    static creator instance;
};

//模板內(nèi)嵌套類,需要用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 單例模板 會(huì)產(chǎn)生多實(shí)例問題
問題初步原因:
不同so中會(huì)對(duì) 類模板進(jìn)行實(shí)例化,并在不同so中各存在 一個(gè)類副本。網(wǎng)上有人確認(rèn)過,singleton 產(chǎn)生的類A代碼,在不同so中 typeid(singleton) 的返回值 type_info 不相等,但我自己確認(rèn)結(jié)果是 兩者相等。
解決方法:
想辦法,讓單例類的實(shí)例化 singleton 只在一個(gè)so中進(jìn)行;
class A
{
...
     A* get_instance(){return singleton::get_instance();}
...
};
想獲得單例時(shí) 執(zhí)行 A::get_instance(),而非 singleton::get_instance();

在這里:testc 類會(huì)被 兩個(gè)不同的so liba.so,libb.so 使用其單例,如果按照1中的方法,則 在liba.so
和libb.so中都會(huì) 調(diào)用 singleton::get_instance(),但因?yàn)?nbsp;liba.so ,libb.so 是不同的編譯單元,
編譯器會(huì) 為兩個(gè) so產(chǎn)生 兩份類 testc 單例化的副本。(后續(xù)在好好梳理)

解決方法
#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"<

參考文獻(xiàn),感謝兩位博主,

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、策勒網(wǎng)站維護(hù)、網(wǎng)站推廣。

http://blog.cnbang.net/tech/2229/

http://blog.csdn.net/crayondeng/article/details/24853471

http://blog.csdn.net/fullsail/article/details/8483106


分享標(biāo)題:C++單例模式
文章網(wǎng)址:http://weahome.cn/article/ihjesd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部