2014-04-05 35 views
1

请帮助.. 我有singleton类,但无法获取它的实例。如何解决C2248:无法访问在Singleton类中声明的私有成员

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

我加了命名空间 '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; 

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

它帮助我。

0

你的构造函数是私有的,所以你不能创建你的类的对象。

+0

我从这里找到了示例:http://stackoverflow.com/a/1008289/2015948也有私人构造函数。 –

+0

你在做这个主吗? DBInfoGetterDAO dbInfoGetterDAO = DBInfoGetterDAO :: getInstance(); – Bramsh

+0

不,我正在做另一个类的构造函数 –

0

似乎getInstance()方法的声明是从它的定义不同,只是改变

static DBInfoGetterDAO getInstance(); 

static DBInfoGetterDAO& getInstance(); 

而且移动内部Ui命名空间中的类定义和类方法的定义哟做了与类前向声明​​。

+0

对不起,我忘了添加它在一个问题中,我现在编辑它 –

0

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

而不是做这一切的,你可以简单地这样做:

Q_GLOBAL_STATIC(MyType, staticType) 

而且,你单身是racey越好。它会突然从不同的线程中炸毁。

0

问题不是在单实施或由于命名空间 它是这里

DBInfoGetterDAO dbInfoGetterDAO = DBInfoGetterDAO ::的getInstance();

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

相关问题