設(shè)計模式之Singleton 單態(tài)模式想必大家都玩過,但是今天我碰到個問題,沒想清楚,忘高手賜教!
下面就是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的實現(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ù)....只不過沒有打印進(jìn)入構(gòu)造函數(shù)...的信息。
WHY ? 沒進(jìn)構(gòu)造函數(shù)那么getSingletonPtr()應(yīng)該是NULL吧。還能調(diào)用函數(shù)print??


