C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でシングルトンクラスを作成する方法をわかりやすく解説

シングルトンデザインパターンとは、クラスのインスタンス化を1つのオブジェクトのみに制限するためのソフトウェア設計原則です。システム全体の動作を調整するオブジェクトが1つだけ必要な場面で特に有効です。

代表的な使用例として、ファイルにログを出力するロガーが挙げられます。シングルトンクラスを利用すれば、アプリケーション全体で単一のロガーインスタンスを共有でき、ログの出力先が分散することを防げます。

以下に、C++でシングルトンクラスを実装する基本的なコード例を示します。

実装例

#include <iostream>
using namespace std;
class Singleton {
    static Singleton *instance;
    int data;
    // コンストラクタをprivateにして、外部からオブジェクトを生成できないようにする
    Singleton() {
        data = 0;
    }
    public:
        static Singleton *getInstance() {
            if (!instance)
            instance = new Singleton;
            return instance;
        }
    int getData() {
        return this -> data;
    }
    void setData(int data) {
        this -> data = data;
    }
};
// ポインタを0で初期化し、最初のgetInstance()呼び出し時にインスタンスが生成されるようにする
Singleton *Singleton::instance = 0;
int main(){
    Singleton *s = s->getInstance();
    cout << s->getData() << endl;
    s->setData(100);
    cout << s->getData() << endl;
    return 0;
}

実行結果

0
100

コードのポイント

1. プライベートコンストラクタ

コンストラクタをprivateにすることで、クラス外部からのnewによるインスタンス生成が禁止されます。これにより、インスタンスの生成はクラス内部だけで完全に制御されます。

2. 静的メンバ変数 instance

staticなポインタ変数instanceが、唯一のインスタンスを保持します。初期値は0(NULL)に設定されており、初めてgetInstance()が呼ばれたタイミングでインスタンスが生成されます。

3. getInstance() メソッド

staticメソッドのgetInstance()は、インスタンスがまだ存在しない場合にのみ新規生成を行い、常に同一のインスタンスへのポインタを返します。そのため、プログラムのどの場所から呼び出しても、必ず同じオブジェクトにアクセスできる仕組みになっています。

注意点:マルチスレッド環境でのスレッドセーフ性

上記の実装はシンプルで理解しやすい反面、マルチスレッド環境では注意が必要です。複数のスレッドが同時にgetInstance()を呼び出すと、競合状態(レースコンディション)により複数のインスタンスが生成されてしまう可能性があります。

C++11以降では、関数内の静的変数を利用した「Meyers' Singleton(マイヤーズのシングルトン)」と呼ばれる手法を使うと、言語仕様によって初期化がスレッドセーフに保証されるため、より安全かつ簡潔に実装できます。

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11以降、この初期化はスレッドセーフ
        return instance;
    }
private:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

用途や動作環境に応じて、適切な実装方式を選択することが重要です。

  1. Androidでシングルトンクラスを使う方法をサンプルコード付きで解説

    シングルトンデザインパターンとは?実装例に入る前に、まず「シングルトンデザインパターン」についておさらいしておきましょう。シングルトン(Singleton)とは、あるクラスのインスタンス生成をアプリケーション全体で1つだけに制限するデザインパターンです。主な用途としては、同時実行(並行処理)の制御や、アプリケーションがデータストアへアクセスするための中心的なアクセスポイントの作成などが挙げられます。この記事では、Androidアプリでシングルトンクラスを実際に使う方法を、ステップごとのサンプルコードとともに解説します。手順1:新規プロジェクトを作成するAndroid StudioでFile →

  2. Pythonでシングルトンクラスを作成する方法を実例付きで解説

    シングルトンパターンとは シングルトンパターンは、クラスのインスタンス数を1つに制限するためのデザインパターンです。このパターンを採用すると、同じオブジェクトがコードのさまざまな部分から常に共有されることになります。実際のデータがシングルトンクラスのインターフェースの背後に隠蔽されるため、グローバル変数を使用するよりもエレガントな解決策であると考えられています。 Pythonでの基本的な実装例 以下のコードは、シングルトンクラスを作成する多くの方法のうちのひとつです。__new__メソッドをオーバーライドし、インスタンス生成時に既存のインスタンスが存在するかどうかを判定します。存在しなければ