2 sinat 21903855 sinat_21903855 于 2015.07.21 22:52 提问

多线程下Singleton模式
 //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;
}

图片说明
我的代码大致是这样的,各位前辈们,帮忙分析一下我的错误吧。。。。

12个回答

hatlonely
hatlonely   2015.07.21 23:02
已采纳

用模板类的实现应该写在.h里面,最好是将.h命名成.hpp,你看看boost里面的头文件基本都是.hpp
这个其实是因为模板在编译的时候并没有实例化,看下这个文章吧c++模板类(一)理解编译器的编译模板过程

devmiao
devmiao   Ds   Rxr 2015.07.21 23:42
devmiao
devmiao   Ds   Rxr 2015.07.21 23:42
oyljerry
oyljerry   Ds   Rxr 2015.07.21 23:08

vs应该不支持模版分离,你把模版定义,实现都放在一起。

devmiao
devmiao   Ds   Rxr 2015.07.21 23:42
oyljerry
oyljerry   Ds   Rxr 2015.07.22 11:40

你用的什么编译器版本,VC6? 请用最新的编译器VS2012等。老版本编译器有问题。

然后就是析构函数最好用虚函数

virtual ~Singleton(){};

sinat_21903855
sinat_21903855 谢谢您的回答,我的问题解决了,哈哈。。。。
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2015.07.21 22:55

SingleTon模式的多线程环境
多线程Singleton单件模式
多线程Singleton单件模式
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

sinat_21903855
sinat_21903855   2015.07.21 23:00

我来顶一下,各位前辈帮忙看看吧。。。。。

sinat_21903855
sinat_21903855   2015.07.22 10:46

将声明和定义都放在一起后,发现还是有一个小小的问题,不知道为什么?请大家帮忙再看一下吧

 //singleton.h

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

#include "synobj.h"
#include <stdlib.h>


template<typename T> 
class Singleton
{
public:

    static T* Instance()
    {

        if(NULL == _instance)
        {
            Lock lock(_mutex);
            if(NULL == _instance)
            {
                T* temp = new T;
                _instance = temp;
                atexit(Destory);
            }   
        }
        return _instance;
    }

protected:

private:
    Singleton(){}
    ~Singleton(){}
    Singleton(Singleton& ){}
    Singleton& operator = (Singleton& ){}
    static void Destory()
    {
        if(NULL != _instance)
        {
            delete _instance;
            _instance = NULL;
        }
    }

private:
    static T*  _instance;
    static Mutex _mutex;
};

template<typename T> T* Singleton<T>::_instance = NULL;
template<typename T> Mutex Singleton<T>::_mutex;
 // 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;
}

图片说明

sinat_21903855
sinat_21903855   2015.07.22 11:11

将类模板的构造函数和析构函数的声明和定义放在public下面,就可以测试通过了,可是这是为什么呢?

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片