acquisire valore attributo di altra classe
-
Buongiorno,
Scusate l'ignoranza è il primo anno che lavoro con QT/QML/QWEBENGINE e C++.
Nel mio progetto istanzio la classe DataBase e imposto un suo attributo pubblico in main.cpp.DataBase *database = new DataBase; if (database->checkDataBase(path_and_name_db)) { database->pippo= database->connectToDataBase(type_db, path_and_name_db, driver_db, . . ., "nome_connessione"); }
Dichiarazione public in classe DataBase:
QSqlDatabase pippo; QSqlDatabase connectToDataBase(int type_db, QString path_and_name_db, QString driver_db, . . ., QString conn_name );
Come posso acquisire DataBase::pippo con il valore impostato nella main se sono in un'altra classe ?
Ovviamente ho provato varie possibilità senza successo prima di chiedere al forum.
Grazie Grazie Grazie Grazie Grazie -
Buongiorno!
La risposta e' semplice ma purtroppo devo anche segnalare che quello che sta facendo e' sbagliato.Da https://doc.qt.io/qt-5/qsqldatabase.html#details
Warning: It is highly recommended that you do not keep a copy of the QSqlDatabase around as a member of a class, as this will prevent the instance from being correctly cleaned up on shutdown. If you need to access an existing QSqlDatabase, it should be accessed with database(). If you chose to have a QSqlDatabase member variable, this needs to be deleted before the QCoreApplication instance is deleted, otherwise it may lead to undefined behavior.
Quindi
QSqlDatabase pippo;
va cancellato e basta chiamareQSqlDatabase::addDatabase
passando"pippo"
come secondo argomento. Da li' in poi basta chamareQSqlDatabase::database("pippo")
per recuperarlo ovunque nel programma. -
@VRonin said in acquisire valore attributo di altra classe:
QSqlDatabase::database("pippo")
Buongiorno,
La ringrazio per la sua risposta. in pratica lo facevo già, solo che portavo su un altro ogetto che suavo nel metodo in qui utilizzavo la connessione e questo mi ha spinto a pensare ce fosse meglio usare un solo oggetto nel progetto.Codice attuale:
QSqlDatabase pippo= QSqlDatabase::database("dbpippo"); QSqlDatabase pluto= QSqlDatabase::database(dbpluto); QSqlQuery querypippo(pippo); QSqlQuery querypluto(pluto);
In pratica basa fare :
QSqlQuery querypippo(QSqlDatabase::database("dbpippo")); QSqlQuery querypluto(QSqlDatabase::database(dbpluto));
Mantenere il codice attuale, porta via molte risorse? Conviene modificarlo seguendo la soluzione più corretta?
-
codice attuale:
QSqlDatabase pippo= QSqlDatabase::database("dbpippo");
Quasi. Il problema e' che il vero codice attuale e':
DataBase *database = new DataBase; database->pippo=QSqlDatabase::database("dbpippo");
Cioe'
pippo
non e' una variabile locale allocata sullo stack ma un membro di un oggetto allocato a memoria dinamica. Se ti dimentichi di chamaredelete
sudatabase
o lo chiami troppo tardi crei problemi al programma. Usare una variabile locale chiamandoQSqlDatabase pippo= QSqlDatabase::database("dbpippo");
tutte le volte che ti serve e' perfettamente valido e sicuro