//singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "synobj.h"
template<typename T>
class Singleton
{
public:
static T* Instance();
protected:
private:
Singleton();
~Singleton();
Singleton(Singleton& );
Singleton& operator = (Singleton& );
static void Destory();
private:
static T* _instance;
static Mutex _mutex;
};
//singleton.cpp
//volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
#include "stdafx.h"
#include "singleton.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
template<typename T> T* Singleton<T>::_instance = NULL;
template<typename T> Mutex Singleton<T>::_mutex;
template<typename T>
Singleton<T>::Singleton()
{
}
template<typename T>
Singleton<T>::~Singleton()
{
}
template<typename T>
T* Singleton<T>::Instance()
{
if(_instance == NULL )
{
Lock lock(_mutex);
if(_instance == NULL)
{
T* temp = new T;
_instance = temp;
//_instance = new T();
atexit(Destory);
}
}
return _instance;
}
template<typename T>
void Singleton<T>::Destory()
{
if(NULL != _instance)
{
delete _instance;
_instance = NULL;
}
}
// Singleton20.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include "singleton.h"
#include "synobj.h"
#include <stdio.h>
#include <iostream>
using namespace std;
class A:public Singleton<A>
{
public:
void DoSomething()
{
cout<<"hello DoSomething"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a = A::Instance();
a->DoSomething();
getchar();
return 0;
}
我的代碼大致是這樣的,各位前輩們,幫忙分析一下我的錯誤吧。。。。
用模板類的實現應該寫在.h裡面,最好是將.h命名成.hpp,你看看boost裡面的頭文件基本都是.hpp
這個其實是因為模板在編譯的時候並沒有實例化,看下這個文章吧c++模板類(一)理解編譯器的編譯模板過程