QT C++ 访问另一个 Class 的 Class 成员

QT C++ access to a Class Member of another Class

我真的不明白以下行为:

3 个代码片段来解释

sqlconnection.h

class SqlConnection
{
public:
SqlConnection();
QSqlDatabase db;
} ;

sqlconnection.cpp

SqlConnection::SqlConnection()
{ if (!db.open()){ //no different with or without that
  db = QSqlDatabase::addDatabase("QODBC");
  ...
}

artikelverwaltung.cpp

Artikelverwaltung::Artikelverwaltung(){

 SqlConnection().db.open();
 ...(code to do works fine)
}
void Artikelverwaltung::on_pushButton_2_clicked()
{

SqlConnection().db.close(); // "HERE"
}

"HERE" 它再次循环 Class 的完整构造函数,但为什么它不直接关闭连接? (这是关于以及如何解决这个问题的主要问题。)

我什至无法从 Class 内部但构造函数外部的另一个方法访问“db”,例如:

sqlconnection.cpp:

void closeDB() {db.close();} 不可能。`

我做错了什么?

谢谢大家

您好,欢迎来到 Whosebug!

如果调用 SqlConnection().db.close();,实际上是在创建 SqlConnection class 的新实例,然后在其变量 db 上调用 close()。这与您之前打开的不同。

你想做的是在你的 Artikelverwaltung 里面 class:

SqlConnection sqlConnection = new SqlConnection();

之后

sqlConnection.db.open();

之后

sqlConnection.db.close();

你不能添加那个closeDB()方法的原因是你需要把这个方法放在SqlConnectionclass里面,或者你需要对closeDB()的一个实例进行操作class.

如果不实例化它(创建它的一个实例),您不能像这样对 class 进行操作。

您应该查看 class 实例化以了解该概念的工作原理。

如果您调用 SqlConnection(),您将创建 class 的新实例(您可以将其视为 class 的副本)。
如果您在其他地方调用 SqlConnection(),您只是在创建一个新实例。
这些实例不共享变量或其中的内容。他们是完全独立的。

如果不首先创建 class 的实例然后访问该实例的成员,则无法访问 class 的成员(如您的 db 变量)。

一般来说,您不需要使用任何包装器 class 来保持 Qt 中的数据库连接。您应该使用 QSqlDatabase::addDatabase 创建一次数据库连接并打开它。之后,您可以通过调用 QSqlDatabase::database 静态方法在任何地方获得数据库连接。因此,要关闭数据库连接,您只需调用 QSqlDatabase::database().close().