2015-10-12 102 views
0

我使用MySQL 5.6 QT5並創建一個類來封裝數據庫連接。
當我嘗試在dbConnect conn = new dbConnect("localhost", "test1","test","user");的主體中創建一個對象時,我得到並顯示錯誤,告訴我我需要從dbConnect*轉換爲非標量類型。
閱讀其他帖子我見過這可能是由於官方類型我試圖,因爲它不是一個很好的做法,在C + +應該是像dbConnect conn("localhost", "test1","test","user");但改變它是這樣的,而不是得到轉換錯誤我現在得到一個no matching function for call to QSqlDatabase::setHosTname(std::string&)和相同的連接所需的其他方法,如setDatabaseName,setUserName和setPassword
難道是因爲我使用std::string? 或者我應該如何創建對象?
這是我的頭db.h
與QT構造對象inicialization,沒有匹配的函數調用

#ifndef DB 
#define DB 
#include <QSqlDatabase> 
#include <string> 
class dbConnect:QSqlDatabase 
{ 
    public: 
     dbConnect(std::string host, std::string name,std::string user, std::string pass); 
     bool createConnection(std::string host, std::string name,std::string user, std::string pass); 
    private: 
     QSqlDatabase dbObject; 
}; 
    #endif // DB_ 

下一頁這是它的實現db.cpp

#include<QSqlDatabase> 
#include <QMessageBox> 
#include <QSqlError> 

class dbConnect:QSqlDatabase 
{ 
private: 
    QSqlDatabase dbObject; 
public: 
    dbConnect(std::string host, std::string name,std::string user, std::string pass) 
    { 
     if(createConnection(host, name, user, pass)) 
     { 
      QMessageBox::information(0,"Connection Status","Connection established with database"); 
     } 
     else 
     { 
      QMessageBox::critical(0,QObject::tr("Error connecting to database"),dbObject.lastError().text()); 
     } 
    } 
    bool createConnection(std::string host, std::string name,std::string user, std::string pass) 
    { 
     dbObject = QSqlDatabase::addDatabase("QMYSQL"); 
     dbObject.setHostName(host); 
     dbObject.setDatabaseName(name); 
     dbObject.setUserName(user); 
     dbObject.setPassword(pass); 
     if(!dbObject.open()) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 
}; 

UPDATE

接過@gengisdave和@R薩胡的解決方案,現在我試圖在主體中創建一個對象。如果我嘗試dbConnect conn();它工作正常,即使構造花費paremeter但是,如果我trye dbConnect conn("localhost","test1","test","user");編譯器給我的undefined reference to dbConnect::dbConnect(std::string,std::string,std::string,std::string)錯誤。

回答

2

QSQlDatabase::setHostName需要一個參數的類型QString,而你提供了一個std ::字符串;下一個3線

相同

您可以更改線

this->setHostName(QString::fromStdString(host)); 
this->setDatabaseName(QString::fromStdString(name)); 
this->setUserName(QString::fromStdString(user)); 
this->setPassword(QString::fromStdString(pass)); 

編輯:它工作正常

的main.cpp

#include <QApplication> 
#include "db.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    dbConnect connection("localhost", "test1", "test", "user"); 
    dbConnect *conn = new dbConnect("localhost", "test1", "test", "user"); 
} 

db.cpp

#include <QSqlDatabase> 
#include <QMessageBox> 
#include <QSqlError> 
#include "db.h" 

dbConnect::dbConnect(std::string host, std::string name,std::string user, std::string pass) 
{ 
    if (createConnection(host, name, user, pass)) 
     QMessageBox::information(0, "Connection Status", "Connection established with database"); 
    else 
     QMessageBox::critical(0,QObject::tr("Error connecting to database"),dbObject.lastError().text()); 
} 

bool dbConnect::createConnection(std::string host, std::string name,std::string user, std::string pass) 
{ 
    this->dbObject = QSqlDatabase::addDatabase("QMYSQL"); 
    this->dbObject.setHostName(QString("localhost")); 
    this->dbObject.setDatabaseName(QString("test.txt")); 
    this->dbObject.setUserName(QString("test")); 
    this->dbObject.setPassword(QString("test")); 
    return this->dbObject.open(); 
} 

db.h

#ifndef DB_H 
#define DB_H 

#include <QSqlDatabase> 
#include <string> 

class dbConnect:QSqlDatabase 
{ 
    public: 
    dbConnect(std::string host, std::string name,std::string user, std::string pass); 
    bool createConnection(std::string host, std::string name,std::string user, std::string pass); 
    private: 
    QSqlDatabase dbObject; 
}; 

#endif 

編譯:gcc db.cpp main.cpp -I/usr/include/qt5/QtSql -I/usr/include/qt5/QtWidgets -I/usr/include/qt5 -fPIC -o main -lstdc++ -lQt5Sql -lQt5Core -lQt5Widgets

+0

謝謝夥計!我從一開始就認爲我會遇到QString的問題,這就是我使用std :: string的原因,但這是所有這些的原因。 –

+0

好的,不是真的,現在如果我創建了dbConnect的對象,如'dbConnect conn(「localhost」,「test1」,「test」,「user」);'編譯器說:'未定義的引用dbConnect :: dbConnect(std :: string,std :: string,std :: string,std :: string)但是,構造函數被聲明爲應該,不是嗎? –

+0

你不需要在.cpp文件中重新定義你的類,改爲'dbConnect :: dbConnect' – gengisdave

3

當你使用:

dbConnect conn = new dbConnect("localhost", "test1","test","user"); 

的RHS是dbConnect*型的,而LHS是dbConnect類型。這是不正確的。編譯器不能將指針指定給對象。

您可以使用:

dbConnect* connPtr = new dbConnect("localhost", "test1","test","user"); 

dbConnect conn("localhost", "test1","test","user"); 

其他問題

bool createConnection(std::string host, std::string name,std::string user, std::string pass) 
{ 
    dbObject = QSqlDatabase::addDatabase("QMYSQL"); 
    dbObject.setHostName(host); 
    dbObject.setDatabaseName(name); 
    dbObject.setUserName(user); 
    dbObject.setPassword(pass); 
    if(!dbObject.open()) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

是不對的。你可能需要:

bool createConnection(std::string host, std::string name,std::string user, std::string pass) 
{ 
    // Since this class is derived from QSqlDatabase, 
    // you can use: 
    this->addDatabase("QMYSQL"); 
    this->setHostName(QString::fromStdString(host)); 
    this->setDatabaseName(QString::fromStdString(name)); 
    this->setUserName(QString::fromStdString(user)); 
    this->setPassword(QString::fromStdString(pass)); 
    if(!this->open()) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

此外,刪除變量

QSqlDatabase dbObject; 

成員你不需要它,因爲該類已經從QSqlDatabase的。你需要使用,只有當你不從QSqlDatabase

相關問題