Bonjour,
Je lis un livre pour apprendre Qt 5 avec C++14. J’essaye d’adapter un exemple mais je suis complètement bloqué. J’essaye de faire un singleton DatabaseManager
avec des data access object
publique. Je ne sais pas trop comment expliquer, tout ça est nouveau pour moi, voici les codes :
DatabaseManager.h
#include <QString>
#include <memory>
#include "Dao.h"
class QSqlDatabase; // Forward declaration
const QString DATABASE_FILENAME{ "database.db" };
class DatabaseManager
{
public:
static DatabaseManager& get();
~DatabaseManager();
const Dao dao;
protected:
DatabaseManager(const QString& path = DATABASE_FILENAME);
DatabaseManager& operator=(const DatabaseManager& rhs);
private:
QSqlDatabase* database_;
};
DatabaseManager.cpp
#include "DatabaseManager.h"
#include <QSqlDatabase>
DatabaseManager& DatabaseManager::get()
{
static DatabaseManager singleton;
return singleton;
}
DatabaseManager::DatabaseManager(const QString& path)
: database_(new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE")))
, dao(*database_)
{
database_->setDatabaseName(path);
database_->open();
dao.init();
}
DatabaseManager::~DatabaseManager()
{
database_->close();
delete database_;
}
Dao.h
class QSqlDatabase;
class Dao
{
public:
AirplaneDao(QSqlDatabase& database);
void init() const;
public:
QSqlDatabase& database_;
};
Dao.cpp
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVariant>
#include "DatabaseManager.h"
Dao::Dao(QSqlDatabase& database)
: database_(database)
{
}
void Dao::init() const
{
bool a = database_.tables().contains("images");
if (!a) {
QSqlQuery query{ database_ };
query.exec("...");
}
}
Je suis désolé pour la longueur du code. D’après mon debugger, Dao::database_
ne contient absolument rien et la ligne bool a = database_.tables().contains("images");
de Dao.cpp
produit une Segmentation fault
. Si je place la même ligne dans le constructeur de DatabaseManager
, aucun problème, ça fonctionne.
Je me doute bien que je me suis embrouillé entre les *
et les &
. Mon objectif est de pouvoir faire :
DatabaseManger::get().dao.create(<params>);
Object a{ DatabaseManager::get().dao.last() };
Je vous remercie pour votre aide !