C++でシングルトンパターンをどのように書くのか

C++でシングルトンパターンを実装する方法は、次のように行うことができます:

class Singleton {
private:
    // 私有构造函数,防止外部创建对象
    Singleton() {}

    // 静态私有成员变量,用于保存单例对象
    static Singleton* instance;

public:
    // 静态公有成员函数,用于获取单例对象
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;

この実装では、コンストラクタをプライベートに設定することで、外部からの直接オブジェクトの作成を防ぐことができます。静的メンバ変数と静的メンバ関数を使用することで、グローバルに唯一のシングルトンオブジェクトを実現し、getInstance関数を介してそのオブジェクトにアクセスすることができます。

注意すべき点は、これは単純な遅延初期化型のシングルトンパターンであるということです。getInstance関数が最初に呼び出されたときにのみオブジェクトが作成されます。スレッドセーフが必要な場合は、ロックを使用して、オブジェクトを作成できるのは1つのスレッドだけだと保証します。

class Singleton {
private:
    // 私有构造函数,防止外部创建对象
    Singleton() {}

    // 静态私有成员变量,用于保存单例对象
    static Singleton* instance;
    
    // 静态私有成员变量,用于加锁
    static std::mutex mtx;

public:
    // 静态公有成员函数,用于获取单例对象
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};

// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

この実装では、スレッドセーフを実現するためにstd::mutexが使用されています。getInstanceが最初に呼び出される際、std::lock_guardを使用してmtxをロックし、オブジェクトを作成できるスレッドが1つだけであることを保証します。

bannerAds