• <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>

            Singleton這又是為什么???

            Posted on 2008-11-26 21:10 MiweiDev 閱讀(594) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C / C++Language

            設(shè)計(jì)模式之Singleton 單態(tài)模式想必大家都玩過(guò),但是今天我碰到個(gè)問題,沒想清楚,忘高手賜教!
            下面就是Singleton頭文件“1.h”

            #ifndef _SINGLETON_H__
            #define _SINGLETON_H__

            #include 
            <assert.h>
            #include 
            <iostream>
            using namespace std;

            #if VW3D_COMPILER == COMPILER_MSVC
            // Turn off warnings generated by this singleton implementation
            #   pragma warning (disable : 4311)
            #   pragma warning (disable : 
            4312)
            #endif


            /** Template class for creating single-instance global classes.
            */

            template 
            <typename T> class Singleton
            {
            protected:

                
            static T* ms_Singleton;

            public:
                Singleton( 
            void )
                
            {
                    cout 
            << "Sungleton Create~" << endl;
                    assert( 
            !ms_Singleton );
                    ms_Singleton 
            = static_cast< T* >this );
                }

                
            ~Singleton( void )
                
            {
                    cout 
            << "Sungleton DeCreate~" << endl;
                    assert( ms_Singleton );  ms_Singleton 
            = 0;  
                }

                
            static T& getSingleton( void )
                
            {  assert( ms_Singleton );  return ( *ms_Singleton );  }
                
            static T* getSingletonPtr( void )
                
            {  return ( ms_Singleton );  }
            }
            ;
            #endif

            下面是一個(gè)類A來(lái)運(yùn)用他“A.h”
            #pragma once
            #include 
            "1.h"
            #include 
            <iostream>
            using namespace std;

            class CA : public Singleton<CA>
            {
            public:
                CA(
            void);
                
            ~CA(void);

                
            void print(int i)
                
            {
                    cout 
            << i << endl;
                }

            }
            ;


            類A的實(shí)現(xiàn)“a.cpp”
            #include ".\a.h"

            CA 
            * Singleton<CA>::ms_Singleton = NULL;

            CA::CA(
            void)
            {
                cout 
            << "Cr CA" << endl;
            }


            CA::
            ~CA(void)
            {
                cout 
            << "~~CA" << endl;
            }


            OK最下面就是Main函數(shù)了~
            #include <Windows.h>
            #include 
            <iostream>
            #include 
            <tchar.h>
            #include 
            <assert.h>
            #include 
            "A.h"
               
            int main()
               
            {
                  
            // CA ca;
                   CA::getSingletonPtr()->print(100);

                   getchar();
                   
            return 0;
               }

            瞧我把CA ca;注釋掉了,但是還是....成功的調(diào)用了函數(shù)....只不過(guò)沒有打印進(jìn)入構(gòu)造函數(shù)...的信息。
            WHY ? 沒進(jìn)構(gòu)造函數(shù)那么getSingletonPtr()應(yīng)該是NULL吧。還能調(diào)用函數(shù)print??

            Feedback

            # re: Singleton這又是為什么???  回復(fù)  更多評(píng)論   

            2008-12-15 12:56 by adrianx
            加個(gè)成員變量就知道了

            # re: Singleton這又是為什么???  回復(fù)  更多評(píng)論   

            2008-12-15 14:33 by 小不點(diǎn)
            按著你的建議,我定義了一個(gè)CA的成員變量m_nMember;在構(gòu)造函數(shù)里面把它初始化為5,同時(shí)也定義了一個(gè)成員函數(shù)Print2(){cout << "i'm print2" <<endl;},這時(shí)候我把print()函數(shù)改變了,在他末尾添加上了打印m_nMember,這時(shí)候出現(xiàn)錯(cuò)誤,說(shuō)訪問0x00000000錯(cuò)誤。我又改變了print函數(shù),去掉了打印m_nMember,在他前面加上了Print2()函數(shù),這時(shí)候又正確了,
            為什么空指針還能調(diào)用成員函數(shù),而訪問成員變量就不是那回事了呢?

            # re: Singleton這又是為什么???  回復(fù)  更多評(píng)論   

            2008-12-15 14:38 by 小不點(diǎn)
            知道了,網(wǎng)上看到的。
            http://topic.csdn.net/u/20070807/09/22087b45-a62e-4b73-b17a-962b8a5f4dd1.html
            只要函數(shù)里面不通過(guò)this指針去操作成員變量就行,成員函數(shù)跟一般的函數(shù)沒什么差別,只不過(guò)調(diào)用方式需要一個(gè)類的對(duì)象或者指針來(lái)調(diào)用罷了,因?yàn)樗J(rèn)綁定了一個(gè)this指針形參而已,這個(gè)指針為0也沒問題。

            # re: Singleton這又是為什么???[未登錄]  回復(fù)  更多評(píng)論   

            2008-12-15 19:12 by 王博煒
            這樣也行?

            只要函數(shù)里面不通過(guò)this指針去操作成員變量就行,成員函數(shù)跟一般的函數(shù)沒什么差別,只不過(guò)調(diào)用方式需要一個(gè)類的對(duì)象或者指針來(lái)調(diào)用罷了。
            這個(gè)解釋不錯(cuò)
            五月丁香综合激情六月久久| 婷婷综合久久狠狠色99h| 亚洲中文字幕无码久久2020| 99re久久精品国产首页2020| 久久99久久无码毛片一区二区| 国内精品伊人久久久久妇| 国产精品久久亚洲不卡动漫| 色婷婷久久久SWAG精品| 2020久久精品国产免费| 久久综合视频网| 久久99久久成人免费播放| 人妻精品久久久久中文字幕一冢本| 国产精品日韩深夜福利久久| 浪潮AV色综合久久天堂| 伊人久久无码精品中文字幕| 91精品国产91久久久久久| 色综合久久久久无码专区| 久久综合成人网| 日本三级久久网| 久久91综合国产91久久精品| 久久亚洲AV成人无码电影| 国内精品伊人久久久影院| 久久亚洲国产成人影院网站| 天天久久狠狠色综合| 久久99中文字幕久久| 99久久99久久精品免费看蜜桃| 久久精品人妻中文系列| 日韩欧美亚洲综合久久影院Ds| 久久精品国产99久久久香蕉| 久久久九九有精品国产| 国产精品久久网| 国产精品18久久久久久vr| 72种姿势欧美久久久久大黄蕉| 亚洲国产一成人久久精品| 久久久久国产精品人妻| 国内精品人妻无码久久久影院导航 | 久久国产精品无码网站| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久精品国产清自在天天线| 国产精品99久久精品爆乳| 国产精品成人精品久久久|