如何解决C2248:无法访问在Singleton类中声明的私有成员

时间:2014-04-05 20:33:43

标签: c++ qt

请帮忙.. 我有单身课,但不能得到它的实例。

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(); 

请你解释一下我做错了什么。

5 个答案:

答案 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正在尝试使用私有构造函数创建对象。

相关问题