请帮忙.. 我有单身课,但不能得到它的实例。
dbinfogetterdao.h
#ifndef MATRIXGETTERDAO_H
#define MATRIXGETTERDAO_H
#include <QtSql/QSqlDatabase>
namespace Ui{
class DBInfoGetterDAO;
}
class DBInfoGetterDAO
{
public:
static DBInfoGetterDAO& getInstance();
private:
DBInfoGetterDAO();
DBInfoGetterDAO(DBInfoGetterDAO const&);
void operator=(DBInfoGetterDAO const&);
};
#endif // MATRIXGETTERDAO_H
dbinfogetterdao.cpp
#include "dbinfogetterdao.h"
#include <QtSql/QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
DBInfoGetterDAO& DBInfoGetterDAO::getInstance()
{
static DBInfoGetterDAO instance;
return instance;
}
DBInfoGetterDAO::DBInfoGetterDAO()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mdpschema");
db.setUserName("root");
db.setPassword("password");
bool ok = db.open();
qDebug() << "db connection status = " << ok;
QSqlError error = db.lastError();
if (ok == false){
qDebug() << "error text = " + error.text();
}
}
我创建了这样的实例:
DBInfoGetterDAO dbInfoGetterDAO = DBInfoGetterDAO::getInstance();
请你解释一下我做错了什么。
答案 0 :(得分:0)
您的构造函数是私有的,因此您无法创建类的对象。
答案 1 :(得分:0)
似乎getInstance()方法声明与其定义不同,只需更改
即可static DBInfoGetterDAO getInstance();
到
static DBInfoGetterDAO& getInstance();
同样在Ui
命名空间内移动类定义和类方法定义,就像你使用类前向声明一样。
答案 2 :(得分:0)
你这样做根本就错了。这不是用Qt定义单例的正确方法。我建议改用QGlobalStatic。
而不是完成所有这些,你可以简单地这样做:
Q_GLOBAL_STATIC(MyType, staticType)
此外,你的单身人士尽可能地惹人注目。它会突然从不同的线程中爆炸。
答案 3 :(得分:0)
我将命名空间'DB'添加到dbinfogetterdao.h:
namespace DB {
namespace Ui{
class DBInfoGetterDAO;
}
class DBInfoGetterDAO
{
public:
static DBInfoGetterDAO& getInstance();
void printAllCountries();
QList<QString> getAppropriateCountriesFromDB(QString property, QString site_type);
Flightmatrix getFlightMatrix(QString site_type);
static void printFlightMatrix(QVector< QVector< int > > matrix);
private:
DBInfoGetterDAO();
DBInfoGetterDAO(DBInfoGetterDAO const&);
void operator=(DBInfoGetterDAO const&);
int getIndexByName(QHash<int, QString> map, QString name);
};
}
在dbinfogetterdao.cpp中我添加了'using namespace DB':
using namespace DB;
DBInfoGetterDAO& DBInfoGetterDAO::getInstance()
{
static DBInfoGetterDAO instance;
return instance;
}
DBInfoGetterDAO::DBInfoGetterDAO()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mdpschema");
db.setUserName("root");
db.setPassword("password");
bool ok = db.open();
qDebug() << "db connection status = " << ok;
QSqlError error = db.lastError();
if (ok == false){
qDebug() << "error text = " + error.text();
}
}
它帮助了我。
答案 4 :(得分:0)
问题不在于单例实现或由于命名空间 它在这里
DBInfoGetterDAO dbInfoGetterDAO = DBInfoGetterDAO :: getInstance();
DBInfoGetterDAO dbInfoGetterDAO正在尝试使用私有构造函数创建对象。