C++ 实现单例模式

实现

#pragma once

#include <windows.h>

/*
使用临界区来枷锁和解锁
*/
class LockBase
{
private:
    // Singleton是LockBase友元,在Singleton类内部可以访问LockBase的私有成员
    friend class Singleton;
    CRITICAL_SECTION cs;
    void lock()
    {
        EnterCriticalSection(&cs);
    }
    void unlock()
    {
        LeaveCriticalSection(&cs);
    }
public:
    LockBase()
    {
        InitializeCriticalSection(&cs);
    }
    ~LockBase()
    {
        DeleteCriticalSection(&cs);
    }
};

class Singleton
{
private:
    static Singleton* instance;
    Singleton(){}
public:
    static Singleton* getInstance()
    {
        // 使用双重检验枷锁机制
        if (NULL == instance)
        {
            LockBase* lockBase = new LockBase();
            lockBase->lock();
            if (NULL == instance)
            {
                instance = new Singleton();
            }
            lockBase->unlock();
        }
        return instance;
    }
};
// 注意C++中静态变量在类内是声明,在类外是定义
Singleton* Singleton::instance = NULL;

测试

#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    if (s1 == s2)
    {
        cout << "s1 和 s2 指向是同一个对象" << endl;
    }

    return 0;
}

注意

注意代码的细节,注意C++中静态变量的定义是在类外。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章