C++ Code Snippet -- 如何定义一个单例类

89 阅读1分钟

单例类可分为线程安全和非线程安全的两种,下面分别介绍两种实现单例的方式:

1. 实现一个单例(非线程安全)

class Singleton {
public:
    Singleton(const Singleton &singleton) = delete;

    const Singleton &operator=(const Singleton &) = delete;

    static Singleton &Get() {
        static Singleton singleton;
        return singleton;
    }

    static int getInt() {
        return Get().getInt_();
    }

    float getFloat() {
        return number;
    }

private:
    Singleton() = default;

    int getInt_() {
        return numberInt;
    }

    int numberInt = 10;
    float number = 0.5f;

};

2. 实现一个单例(使用std::lock_guard保证线程安全)

#include <iostream>
#include <mutex>
class Singleton {
private:
    static Singleton* instance;
    static std::mutex mutex;
    Singleton() = default;
public:
    static Singleton* getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    void showMessage() {
        std::cout << "Hello, I am a singleton object!" << std::endl;
    }
};
#include "Singleton.h"
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

3. 实现一个单例(使用std::call_once保证只初始化一次)

#include <iostream>

class SingletonApp {
private:

    SingletonApp()= default;

public:
    static SingletonApp* getInstance();

    void showMessage() {
        std::cout<<this<<std::endl;
    }
};
#include "SingletonApp.h"

SingletonApp *SingletonApp::getInstance() {
    static SingletonApp* instance;
    static std::once_flag flag;

    std::call_once(flag, []{
       instance =  new SingletonApp();
    });
    return instance;
}