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

How to resolve C2248: cannot access private member declared in Singleton class

本文关键字:单例类 声明 成员 访问 何解决 解决 C2248      更新时间:2023-10-16

请帮忙。我有单例类,但无法获得它的实例。

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

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

构造函数是私有的,因此无法创建类的对象。

似乎getInstance()方法声明与其定义不同,只是更改

static DBInfoGetterDAO getInstance();

static DBInfoGetterDAO& getInstance();

还要将类定义和类方法定义移动到命名空间Ui就像 yo 对类前向声明所做的那样。

你从根本上做错了。这不是用Qt定义单例的正确方法。我建议改用QGlobalStatic。

与其做所有这些,不如简单地这样做:

Q_GLOBAL_STATIC(MyType, staticType)

此外,您的单身人士尽可能激烈。它会突然从不同的线程爆炸。

我将命名空间'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我添加了"使用命名空间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();
    }
}

它帮助了我。

问题不在单例实现中或由于命名空间它在这里

DBInfoGetterDAO dbInfoGetterDAO = DBInfoGetterDAO::getInstance();

DBInfoGetterDAO dbInfoGetterDAO 正在尝试使用私有构造函数创建对象。