📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

340行目: 340行目:
つまり、<code>QML_SINGLETON(<クラス名>, createSingleton)</code>のような形式となる。<br>
つまり、<code>QML_SINGLETON(<クラス名>, createSingleton)</code>のような形式となる。<br>
<br>
<br>
実装する場合には、静的メンバー変数を使用してシングルトンインスタンスを保持して、静的ファクトリー関数内でこのインスタンスを生成・返却する方法が一般的である。<br>
実装する場合には、静的メンバ変数を使用してシングルトンインスタンスを保持して、静的ファクトリー関数内でこのインスタンスを生成・返却する方法が一般的である。<br>
<br>
<br>
QMLエンジンがシングルトンを必要とするまで、実際のインスタンス生成を遅延させることができる。<br>
QMLエンジンがシングルトンを必要とするまで、実際のインスタンス生成を遅延させることができる。<br>
これにより、リソースの効率的な利用が可能になる。<br>
これにより、リソースの効率的な利用が可能になる。<br>
<br>
<br>
※注意<br>
<u>※注意</u><br>
スレッドセーフティに関しても考慮が必要である。<br>
<u>スレッドセーフティに関しても考慮が必要である。</u><br>
複数のスレッドから同時にアクセスされる可能性がある場合、適切な同期メカニズムを実装することが重要となる。<br>
<u>複数のスレッドから同時にアクセスされる可能性がある場合、適切な同期メカニズムを実装することが重要となる。</u><br>
<br>
<br>
このアプローチを使用することにより、デフォルトコンストラクタを持たないクラスでも、QMLシングルトンとして効果的に機能させることができる。<br>
静的ファクトリー関数を使用することにより、デフォルトコンストラクタを持たないクラスでも、QMLシングルトンとして効果的に機能させることができる。<br>
静的ファクトリー関数を通じて、インスタンスの生成・返却を細かく制御できるため、より柔軟性の高い設計が可能になる。<br>
静的ファクトリー関数を通じて、インスタンスの生成・返却を細かく制御できるため、より柔軟性の高い設計が可能になる。<br>
<br>
<br>
357行目: 357行目:
  #include <QObject>
  #include <QObject>
  #include <QtQml/qqmlregistration.h>
  #include <QtQml/qqmlregistration.h>
#include <QMutex>
#include <QMutexLocker>
#include <memory>
  #include <QDebug>
  #include <QDebug>
   
   
366行目: 369行目:
  private:
  private:
     explicit MySingleton(QObject *parent = nullptr) : QObject(parent) {}
     explicit MySingleton(QObject *parent = nullptr) : QObject(parent) {}
     static   MySingleton* instance;
     static std::unique_ptr<MySingleton> instance;  // インスタンスの生存期間を適切に管理する
    QMutex                              m_mutex;
    // コピーコンストラクタと代入演算子の無効化
    MySingleton(const MySingleton&) = delete;
    MySingleton& operator=(const MySingleton&) = delete;
   
   
  public:
  public:
     Q_INVOKABLE void doSomething()
     Q_INVOKABLE void doSomething()
     {
     {
      // このメソッドが複数のスレッドから同時に呼ばれても、安全に実行される
      QMutexLocker locker(&m_mutex);
       qDebug() << "MySingleton is doing something!";
       qDebug() << "MySingleton is doing something!";
     }
     }
378行目: 388行目:
       Q_UNUSED(engine)
       Q_UNUSED(engine)
       Q_UNUSED(scriptEngine)
       Q_UNUSED(scriptEngine)
      // 複数のスレッドから同時に呼ばれても、インスタンスが1度だけ生成されることを保証する
      static QMutex mutex;
      QMutexLocker locker(&mutex);
   
   
       if (!instance) {
       if (!instance) {
           instance = new MySingleton();
          // インスタンスの生存期間を適切に管理する
           instance.reset(new MySingleton());
       }
       }
   
   
       return instance;
       return instance.get();
     }
     }
  };
  };
   
   
  MySingleton* MySingleton::instance = nullptr;
  // メモリリークを防いで、リソース管理を改善する
std::unique_ptr<MySingleton> MySingleton::instance = nullptr;
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>