C++でシングルトンパターンを実装する方法

以下にC++におけるシングルトンパターンのシンプルなコード例を示します。

class Singleton {
private:
    static Singleton* instance;
    Singleton() {} // 将构造函数设为私有,防止外部创建对象

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr; // 静态成员变量需要在类外初始化

int main() {
    Singleton* obj1 = Singleton::getInstance();
    Singleton* obj2 = Singleton::getInstance();

    // obj1和obj2是同一个对象
    if (obj1 == obj2) {
        std::cout << "obj1 and obj2 are the same instance." << std::endl;
    }

    return 0;
}

この例では、Singletonクラスは1つのprivateなstaticメンバ変数instanceと、1つのpublicなstaticメンバ関数getInstanceだけを持ちます。staticメンバ変数instanceは、唯一のインスタンスオブジェクトを格納するために使用されます。getInstance関数は、唯一のインスタンスオブジェクトを取得するために使用され、instanceがnullptrの場合は新しいインスタンスを作成し、そうでない場合は既存のインスタンスを返します。

Singleton::getInstance()メソッドを使用して、main関数でobj1とobj2の2つのオブジェクトを取得し、それらが同じオブジェクトであるかどうかを比較します。

遅延初期化方式は、インスタンスオブジェクトを作成する際に初期化を行うレイジーパターンと呼ばれています。ただし、レイジーパターンはマルチスレッド環境において、スレッドセーフの問題が発生する可能性があります。スレッドセーフを保証するには、ミューテックスや二重ロックチェックなどの方法によって改善することができます。

bannerAds