C++ 在QT中使用构造函数对对象进行初始化,没有要调用的匹配函数
我将Mysql 5.6与Qt5一起使用,并创建一个类来封装数据库连接。C++ 在QT中使用构造函数对对象进行初始化,没有要调用的匹配函数,c++,mysql,qt,type-conversion,C++,Mysql,Qt,Type Conversion,我将Mysql 5.6与Qt5一起使用,并创建一个类来封装数据库连接。 当我尝试在main中创建一个对象时,使用dbconnectconn=newdbconnect(“localhost”、“test1”、“test”、“user”)我得到一个错误,告诉我需要从dbConnect*转换为非标量类型。 阅读我所看到的其他帖子可能是因为我尝试的类型化,因为它不是C++中的一个好的实践,应该像“代码> dBut连接CONN(“本地主机”,“TEST 1”,“测试”,“用户”);代码>但是,这样更改它,
当我尝试在main中创建一个对象时,使用
dbconnectconn=newdbconnect(“localhost”、“test1”、“test”、“user”)代码>我得到一个错误,告诉我需要从dbConnect*
转换为非标量类型。
阅读我所看到的其他帖子可能是因为我尝试的类型化,因为它不是C++中的一个好的实践,应该像“代码> dBut连接CONN(“本地主机”,“TEST 1”,“测试”,“用户”);代码>但是,这样更改它,我现在得到的不是转换错误,而是一个无匹配函数,用于调用QSqlDatabase::setHosTname(std::string&)
,与连接所需的其他方法相同,如setDatabaseName、setUserName和setPassword
可能是因为我使用的std::string
吗?
或者我应该如何创建对象
这是m y头db.h
:
#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_
#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;
}
}
};
更新
以@gengisdave和@R Sahu解决方案为例,现在我正尝试在main中创建一个对象。如果我尝试dbconnectconn()代码>即使构造函数使用paremeter,它也可以正常工作,但是如果我尝试使用dbconnectconn(“localhost”、“test1”、“test”、“user”)当您使用以下命令时,code>编译器向我提供了一个对dbConnect::dbConnect(std::string,std::string,std::string,std::string,std::string)的未定义引用的错误:
dbConnect conn = new dbConnect("localhost", "test1","test","user");
右侧为dbConnect*
型,左侧为dbConnect
型。这是不对的。编译器无法获取指针并将其分配给对象
您可以使用:
dbConnect* connPtr = new dbConnect("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
派生时,才需要使用该选项:
dbConnect conn = new dbConnect("localhost", "test1","test","user");
右侧为dbConnect*
型,左侧为dbConnect
型。这是不对的。编译器无法获取指针并将其分配给对象
您可以使用:
dbConnect* connPtr = new dbConnect("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
派生时,才需要使用它,而您需要提供一个std::string类型的参数;接下来的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.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
dbConnect连接(“localhost”、“test1”、“test”、“user”);
dbConnect*conn=newdbconnect(“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”
dbConnect::dbConnect(std::string主机、std::string名称、std::string用户、std::string传递)
{
if(createConnection(主机、名称、用户、过程))
QMessageBox::信息(0,“连接状态”,“与数据库建立连接”);
其他的
QMessageBox::critical(0,QObject::tr(“连接到数据库时出错”)、dbObject.lastError().text();
}
bool dbConnect::createConnection(std::string主机、std::string名称、std::string用户、std::string传递)
{
这->dbObject=QSqlDatabase::addDatabase(“QMYSQL”);
这->dbObject.setHostName(QString(“localhost”);
这->dbObject.setDatabaseName(QString(“test.txt”);
这个->dbObject.setUserName(QString(“test”);
这个->dbObject.setPassword(QString(“test”);
返回此->dbObject.open();
}
db.h
\ifndef DB\u H
#定义DB_H
#包括
#包括
类dbConnect:QSqlDatabase
{
公众:
dbConnect(std::string主机、std::string名称、std::string用户、std::string传递);
boolcreateconnection(std::string主机、std::string名称、std::string用户、std::string传递);
私人:
qsqldbobject数据库;
};
#恩迪夫
编译时使用:gcc db.cpp main.cpp-I/usr/include/qt5/QtSql-I/usr/include/qtwidts-I/usr/include/qt5-fPIC-o main-lstdc++-lQt5Sql-lQt5Core-lQt5Widgets
需要QString类型的参数,而提供std::string;接下来的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.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
dbConnect连接(“localhost”、“test1”、“test”、“user”);
dbConnect*conn=newdbconnect(“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”
dbConnect::dbConnect(std::string主机、std::string名称、std::string用户、std::string传递)
{
if(createConnection(主机、名称、用户、过程))
QMessageBox::信息(0,“连接状态”,“与数据库建立连接”);
其他的
QMessageBox::critical(0,QObject::tr(“连接到数据库时出错”)、dbObject.lastError().text();
}
bool dbConnect::createConnection(std::string主机、std::string名称、std::string用户、std::string传递)
{
这->dbObject=QSqlDatabase::addDatabase(“QMYSQL”);
这->dbObject.setHostName(QString(“localhost”);
这->dbObject.setDatabaseName(QString(“test.txt”);
这个->dbObject.setUserName(QString(“test”);
这个->dbObject.setPassword(QString(“test”);
返回此->dbObject.open();
}
db.h
\ifndef DB\u H
#定义DB_H
#包括
#包括
类dbConnect:QSqlDatabase
{
公众:
dbConnect(std::string主机、std::string名称、std::string用户、std::string传递);
boolcreateconnection(std::string主机、std::string名称、std::string用户、std::string传递);
私人:
qsqldbobject数据库;
};
#结束