我在 C++ 项目中使用 Qt 库,但我有一个设计问题:数据库应该在哪里声明?我不想声明全局变量。
目前我正在以这种方式处理这个问题。我有一个主窗口,并且已在其中声明了数据库,因此我在主窗口中执行查询并使用不同的信号和槽将结果传递到对话框。
我在主窗口启动时启动数据库,并在窗口关闭时关闭数据库。我不知道这是否可以 现在我还需要另一个类中的数据库连接,以便我可以传递对数据库的引用或使数据库全局
我不喜欢这些解决方案..是否有标准模式来处理这种情况?
编辑:
我的类(class)现在看起来像:
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
}
如果我愿意,我可以添加添加和删除方法,但我只有一个数据库实例。
最佳答案
如果您使用QSqlDatabase
,则实际上不需要将其设为全局变量。只需在首次启动应用程序时设置连接,然后在不同模块中需要时使用静态 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");
来自the docs :
QSqlDatabase
is a value class. Changes made to a database connection via one instance ofQSqlDatabase
will affect other instances ofQSqlDatabase
that represent the same connection. UsecloneDatabase()
to create an independent database connection based on an existing one.
注意:如果您的应用程序是多线程的,则必须小心仅在创建它的线程中使用连接。
关于c++ - 我应该在哪里声明数据库对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808430/