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()
方法的原因是你需要把这个方法放在SqlConnection
class里面,或者你需要对closeDB()
的一个实例进行操作class.
如果不实例化它(创建它的一个实例),您不能像这样对 class 进行操作。
您应该查看 class 实例化以了解该概念的工作原理。
如果您调用 SqlConnection()
,您将创建 class 的新实例(您可以将其视为 class 的副本)。
如果您在其他地方调用 SqlConnection()
,您只是在创建一个新实例。
这些实例不共享变量或其中的内容。他们是完全独立的。
如果不首先创建 class 的实例然后访问该实例的成员,则无法访问 class 的成员(如您的 db 变量)。
一般来说,您不需要使用任何包装器 class 来保持 Qt 中的数据库连接。您应该使用 QSqlDatabase::addDatabase
创建一次数据库连接并打开它。之后,您可以通过调用 QSqlDatabase::database
静态方法在任何地方获得数据库连接。因此,要关闭数据库连接,您只需调用 QSqlDatabase::database().close()
.
我真的不明白以下行为:
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()
方法的原因是你需要把这个方法放在SqlConnection
class里面,或者你需要对closeDB()
的一个实例进行操作class.
如果不实例化它(创建它的一个实例),您不能像这样对 class 进行操作。
您应该查看 class 实例化以了解该概念的工作原理。
如果您调用 SqlConnection()
,您将创建 class 的新实例(您可以将其视为 class 的副本)。
如果您在其他地方调用 SqlConnection()
,您只是在创建一个新实例。
这些实例不共享变量或其中的内容。他们是完全独立的。
如果不首先创建 class 的实例然后访问该实例的成员,则无法访问 class 的成员(如您的 db 变量)。
一般来说,您不需要使用任何包装器 class 来保持 Qt 中的数据库连接。您应该使用 QSqlDatabase::addDatabase
创建一次数据库连接并打开它。之后,您可以通过调用 QSqlDatabase::database
静态方法在任何地方获得数据库连接。因此,要关闭数据库连接,您只需调用 QSqlDatabase::database().close()
.