Singleton这又是为什么???

Posted on 2008-11-26 21:10 MiweiDev 阅读(580) 评论(4)  编辑 收藏 引用 所属分类: C / C++Language

设计模式之Singleton 单态模式想必大家都玩过,但是今天我碰到个问题,没想清楚,忘高手赐教!
下面就是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

下面是一个类A来运用他“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的实现“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函数了~
#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;注释掉了,但是还是....成功的调用了函数....只不过没有打印进入构造函数...的信息。
WHY ? 没进构造函数那么getSingletonPtr()应该是NULL吧。还能调用函数print??

Feedback

# re: Singleton这又是为什么???  回复  更多评论   

2008-12-15 12:56 by adrianx
加个成员变量就知道了

# re: Singleton这又是为什么???  回复  更多评论   

2008-12-15 14:33 by 小不点
按着你的建议,我定义了一个CA的成员变量m_nMember;在构造函数里面把它初始化为5,同时也定义了一个成员函数Print2(){cout << "i'm print2" <<endl;},这时候我把print()函数改变了,在他末尾添加上了打印m_nMember,这时候出现错误,说访问0x00000000错误。我又改变了print函数,去掉了打印m_nMember,在他前面加上了Print2()函数,这时候又正确了,
为什么空指针还能调用成员函数,而访问成员变量就不是那回事了呢?

# re: Singleton这又是为什么???  回复  更多评论   

2008-12-15 14:38 by 小不点
知道了,网上看到的。
http://topic.csdn.net/u/20070807/09/22087b45-a62e-4b73-b17a-962b8a5f4dd1.html
只要函数里面不通过this指针去操作成员变量就行,成员函数跟一般的函数没什么差别,只不过调用方式需要一个类的对象或者指针来调用罢了,因为它默认绑定了一个this指针形参而已,这个指针为0也没问题。

# re: Singleton这又是为什么???[未登录]  回复  更多评论   

2008-12-15 19:12 by 王博炜
这样也行?

只要函数里面不通过this指针去操作成员变量就行,成员函数跟一般的函数没什么差别,只不过调用方式需要一个类的对象或者指针来调用罢了。
这个解释不错

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理