如何解决 C2248:无法访问在单例类中声明的私有成员
How to resolve C2248: cannot access private member declared in Singleton class
请帮忙。我有单例类,但无法获得它的实例。
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 正在尝试使用私有构造函数创建对象。
相关文章:
- C++ 实现模板单例类时出现链接错误
- 具有非默认构造函数的单例类
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- 如何在单例类中管理变量状态?
- 访问单例类C++时出现问题
- 基于 IOKit 的 kext 驱动程序中的单例类
- 指向抽象模板单例类的指针向量C++?
- C++在单例类中创建类实例时遇到困难
- 如果我这样写,我的单例类会导致什么错误
- 这是一个有效的单例类吗?
- 函数内具有静态变量的单例类(迈耶实现)
- 继承的模板化单例类 c++ 中未定义的构造函数
- 为什么调用单例类 Qt 消息处理程序成员函数会出现错误:缺少参数列表
- C++:单例类设计(错误:未解析的外部符号)
- 使用静态和避免单例模式声明全局变量
- 构造函数在不同线程中的静态单例类上调用两次
- 如何在自定义单例类中使用log4cplus
- 为什么在C 中创建单例类创建期间静态函数参考静态变量
- 在单例类中声明和访问枚举- c++
- 如何解决 C2248:无法访问在单例类中声明的私有成员