2

C++ プロジェクトで Qt ライブラリを使用していますが、設計上の質問があります。データベースはどこで宣言する必要がありますか? グローバル変数を宣言しないことをお勧めします。

現在、私はこの方法でこの問題に取り組んでいます。メインウィンドウがあり、そこでDBを宣言したので、メインウィンドウでクエリを実行し、さまざまなシグナルとスロットを使用して結果をダイアログに渡します。

メイン ウィンドウの起動時に DB を起動し、ウィンドウが閉じられたら DB を閉じます。これで問題ないかどうかわかりません。DB への参照を渡すか、DB をグローバルにするために、別のクラスでも DB 接続が必要です。

私はこれらの解決策が好きではありません..この状況に対処するための標準的なパターンはありますか?

編集:

私のクラスは次のようになります。

class Database
{
  public:
    bool open(void);
    bool close(void);
    static Database* getDatabase(void);
    // various methods like loadThisTable(), saveThisTable() etc

  private:
    Database();                                // disable constructor
    ~Database();                               // disable destructor
    Database(const Database&);                 // disable copy constructor
    Database& operator=(const Database&);      // disable assignment

    static Database* instance_;                // database instance
    QSqlDatabase qtDB;                         // qt db database
}

必要に応じて add メソッドと remove メソッドを追加できますが、DB インスタンスは 1 つしかありません。

4

2 に答える 2

2

を使用している場合はQSqlDatabase、グローバル変数にする必要はありません。アプリケーションを最初に起動するときに接続をセットアップするだけstatic QSqlDatabaseで、別のモジュールで必要になったときにメソッドを使用して接続にアクセスできます。

QSqlDatabase db;  // set up the default connection
// alternative:  set up a named connection
// QSqlDatabase db("conn-name");

// set the connection params and open the connection

// ... later on
QSqlDatabase db = QSqlDatabase::database();  // retrieve the default connection
// alternative:  retrieve the named connection
// QSqlDatabase db = QSqlDatabase::database("conn-name");

ドキュメントから:

QSqlDatabase値クラスです。の 1 つのインスタンスを介してデータベース接続に加えられた変更は、同じ接続を表す のQSqlDatabase他のインスタンスに影響します。既存のデータベース接続に基づいて独立したデータベース接続を作成するためにQSqlDatabase使用します。cloneDatabase()

注: アプリケーションがマルチスレッドの場合は、作成されたスレッドでのみ接続を使用するように注意する必要があります。

于 2013-07-01T16:09:59.360 に答える
0

singletonパターンが必要です。インスタンスを 1 つだけ持つグローバル クラスです。これをアンチパターンと呼ぶ人もいますが (実際にそうである場合もあります)、データベース接続などのリソースを処理する最良の方法です。また、メソッドを使用して名前でインスタンスを取得

できることを忘れないでください(名前はメソッドを介して設定できます)。これにより、インスタンスを格納するためだけにシングルトンを作成することを回避できます。QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]QSqlDatabaseQSqlDatabase QSqlDatabase::addDatabase ( QSqlDriver * driver, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]QSqlDatabase

于 2013-04-04T12:45:38.780 に答える