• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 18,  comments - 104,  trackbacks - 0
            最近在coding的時(shí)候,寫了這么一段代碼:

             A.h
            1// A.h
            2#include <map>
            3
            4class A
            5{
            6public:
            7    static std::map<intint> x;
            8}
            ;

            A.cpp
            1// A.cpp
            2#include "A.h"
            3
            4std::map<intint> Test::x;

            很簡(jiǎn)單,也很正常,看看用法吧。

            main.cpp
             1class B
             2{
             3public:
             4    B();
             5}
            ;
             6
             7class C
             8{
             9public:
            10    static B b;
            11}
            ;
            12
            13B C::b;
            14
            15B::B()
            16{
            17    A::x[1= 2;
            18}

            19
            20void main()
            21{
            22    A::x[3= 3;
            23}

            好了,按照上面的寫法,把代碼分別放到3個(gè)文件里面,編譯,通過, 鏈接,通過,運(yùn)行,掛了!!why?
            解決方案很簡(jiǎn)單,把A.cpp里面的那句定義放到main.cpp里面就好了。

            問題在于兩個(gè)static變量分別在兩個(gè)不同的文件里,A.cpp 里面那static變量要在main.cpp前初始化才行,可是編譯器不知道呀,結(jié)果main里面的先初始化了,等到調(diào)用A.cpp里面那個(gè)變量時(shí),已經(jīng)來不及啦。

            這個(gè)就是依賴編譯器初始化順序的程序,如果有人運(yùn)行沒有掛,那恭喜啦,等到它掛的時(shí)候你可要哭了。

            上面的解決方案太爛了,如果程序規(guī)模很大,就完了,比如有好幾個(gè)cpp里面要用到A.cpp里面那個(gè)變量,放哪個(gè)里面好呢?
            這時(shí)候,Scott Mayer的Singleton就是解決方案啦,它能保證靜態(tài)變量在使用前被初始化。

            看看下面的代碼:
             1class static_
             2{
             3public:
             4   template <int N, class T>
             5   static T& var()
             6   {
             7       static T instance;
             8       return instance;
             9   }

            10
            11private:
            12   ~static_() {}
            13}
            ;

            有了這個(gè)定義,想用靜態(tài)變量的時(shí)候就爽啦~~,用的時(shí)候:
            1static_::var<0, std::string>() = ":)"
            2static_::var<0, std::map<intint> >()[0= 3;
            3static_::var<1, std::string>() = "haha";


            現(xiàn)在的效果就是,想讓Test里面有什么,他就有什么,我指靜態(tài)變量。注意啦,第一個(gè)模板參數(shù)是為了可以定義同種類型的多個(gè)變量,就相當(dāng)于
            var_0, var_1...

            是不是感覺有點(diǎn)動(dòng)態(tài)語言的特性了,變量不用定義就可以用。而且變量初始化順序也不用關(guān)心啦,因?yàn)樗械淖兞繒?huì)在使用前初始化完畢。

            如果和boost::function合作起來,效果更佳。look!
             1class Fun
             2{
             3public:
             4    Fun()
             5        : UId(&static_::var<0, std::string>)
             6    {
             7    }

             8    // interface for static variable.
             9    boost::function<std::string& (void)> UId;
            10}
            ;
            11
            12void main()
            13{
            14    Fun f1, f2;
            15    // set static from f1
            16    f1.UId() = "abc";
            17    // get static from f2
            18    std::string str = f2.UId();
            19}

            好了,static就到這里吧。
            posted on 2009-03-20 14:16 尹東斐 閱讀(4657) 評(píng)論(5)  編輯 收藏 引用

            FeedBack:
            # re: static 變量初始化順序的問題和解決方案。
            2009-03-20 14:31 | 陳梓瀚(vczh)
            final solution:不要用不是singleton的全局變量,singleton不要循環(huán)依賴。  回復(fù)  更多評(píng)論
              
            # re: static 變量初始化順序的問題和解決方案。
            2009-03-20 14:55 | 尹東斐
            @陳梓瀚(vczh)

            很精辟,贊。  回復(fù)  更多評(píng)論
              
            # re: static 變量初始化順序的問題和解決方案。
            2009-03-22 17:28 | 阿福1
            # re: static 變量初始化順序的問題和解決方案。
            2010-09-28 17:36 | 網(wǎng)絡(luò)監(jiān)控
            如何控制static變量析構(gòu)的順序呢?  回復(fù)  更多評(píng)論
              
            # re: static 變量初始化順序的問題和解決方案。
            2010-10-14 16:34 | 匿名
            main.cpp 編譯不過,沒有include "A.h"
            加入后可以正常運(yùn)行  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2010年2月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28123456
            78910111213

            常用鏈接

            留言簿(4)

            隨筆檔案

            文章分類

            文章檔案

            相冊(cè)

            好友博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            中文字幕精品久久| 四虎亚洲国产成人久久精品| 99久久夜色精品国产网站| 99久久99久久精品国产片果冻| 久久精品成人欧美大片| 久久亚洲私人国产精品vA| 久久国产精品久久国产精品| 久久性精品| 日本人妻丰满熟妇久久久久久| 一本色道久久88加勒比—综合| 色婷婷久久久SWAG精品| 麻豆亚洲AV永久无码精品久久| 久久精品国产精品亚洲人人 | 日韩精品久久久久久免费| 伊人久久综在合线亚洲2019| 国产精品99久久久久久宅男小说| 国产精品美女久久久m| 久久精品成人影院| 18岁日韩内射颜射午夜久久成人 | 亚洲国产精品无码久久| 日本久久久久久中文字幕| 亚洲欧美伊人久久综合一区二区| 久久久精品一区二区三区| 中文字幕精品无码久久久久久3D日动漫| 久久精品国产亚洲AV无码麻豆| 免费精品久久久久久中文字幕| 久久久精品一区二区三区| 国产∨亚洲V天堂无码久久久| 国内精品伊人久久久久777| 欧美午夜精品久久久久久浪潮| 丁香久久婷婷国产午夜视频| 国内精品久久人妻互换| 无码人妻久久一区二区三区免费 | 狠狠色丁香久久婷婷综合| 久久乐国产综合亚洲精品| 久久久受www免费人成| 久久人人超碰精品CAOPOREN| 久久久久久狠狠丁香| 久久婷婷久久一区二区三区| 国产精品久久久久影院色| 国产精品99久久精品|