2014-04-05 62 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正在嘗試使用私有構造函數創建對象。

相關問題