C++Qt 类对象位于另一个类中

C++Qt class object in another class

本文关键字:另一个 对象 C++Qt      更新时间:2023-10-16

我在另一个类对象中使用一个类对象时遇到问题。问题是 - 我的 soap服务器.cpp 功能LNK2019错误。但首先要做的是。

这是我第一堂课的标题

//datalayer.h
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
class DataLayer : public QObject
{
    Q_OBJECT
public:
    bool set_delivered(const QString& UCID, const QString& Key, QVariant &result);
    explicit DataLayer(QObject *parent = 0);
    QString getLastError() const{return lastError;}
private:
    QString lastError;
};

我在 cpp 也有定义set_delivered

    //datalayer.cpp
DataLayer::DataLayer(QObject *parent) : QObject(parent)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","DB");
    //db.databaseName();
    //db.hostName();
    //db.userName();
    //db.password();
    q = new QSqlQuery(db);
    //q->prepare(""); //not implemented yet
}
DataLayer::~DataLayer()
{
    QSqlDatabase db = QSqlDatabase::database("DB",false);
    if(db.open())
    {
       db.close();
    }
    QSqlDatabase::removeDatabase("DB");
}
bool DataLayer::set_delivered(const QString &UCID, const QString &Key, QVariant &result)
{
    result.clear();
    QSqlDatabase db = QSqlDatabase::database("DB",false);
    if(!db.open())
    {
        lastError = db.lastError().text();
        return false;
    }
    q->prepare("INSERT INTO ActiveCall VALUES(:UCID,:Time,NULL,NULL,:Key)");
    q->bindValue(":UCID",UCID);
    q->bindValue(":Time",QTime::currentTime().toString("HH:mm:ss:zzz"));
    q->bindValue(":Key",Key);
    if(!q->exec())
    {
        lastError = q->lastError().text();
        return false;
    }
    q->next();
    result = q->value("Time").toString();
    db.close();
    return true;
}

让我们跳到另一个类,mysoapserver

//mysoapserver.h
#include "soap/soapKursWebService.h"
#include "soap/soapH.h"
#include <QObject>
#include <QSqlQuery>
#include <qdebug.h>
#include "datalayer.h"// I'm including datalayer header here
class MySOAPServer : public QObject, public KursWebService
{
    Q_OBJECT
public:
    MySOAPServer(QObject* parent = 0);
    int delivered(int UCID, int DeviceNum, int &result);
private:
    DataLayer* r;// creating of the class object
};

而且,主要部分,这个类的cpp

//mysoapserver.cpp
int MySOAPServer::delivered(int UCID, int DeviceNum, int &result)//вызов доставлен, но трубку не снял, в табличку время начала
{
    qDebug()<<"delivered "<<UCID<<" "<< DeviceNum;
    QVariant res = 0;
    QString UCID_S = QString::number(UCID);
    QString Key_S = QString::number(DeviceNum);
    bool ok = r->set_delivered(UCID_S,Key_S,res);//LNK2019 here
    if(!ok)
        result = r->getLastError().toInt();//magicly works here
    else
        result = res.toInt();
    return SOAP_OK;
}

我知道,我对类对象做了一些愚蠢的事情,但现在我完全迷失了。提前感谢您的帮助!

编辑:添加了我的.pro文件和数据层.cpp

专业文件:

#-------------------------------------------------
#
# Project created by QtCreator 2016-04-19T02:23:22
#
#-------------------------------------------------
QT       += core gui network sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Server_MVSC_Kurs_III
TEMPLATE = app
DEFINES += WITH_PURE_VIRTUAL
INCLUDEPATH += 
    C:/Qt/gsoap-2.8.15/gsoap/
SOURCES += main.cpp
        mainwindow.cpp 
    ipcserver.cpp 
    mysoapserver.cpp 
    soap/soapC.cpp 
    soap/soapKursWebService.cpp 
    soap/stdsoap2.cpp 
    datalayer.cpp
HEADERS  += mainwindow.h 
    ipcserver.h 
    mysoapserver.h 
    soap/soapH.h 
    soap/soapKursWebService.h 
    soap/soapStub.h 
    soap/stdsoap2.h 
    soap/KursWeb.nsmap 
    datalayer.h
FORMS    += mainwindow.ui

如果有更多信息会有所帮助,但从那里...

我认为问题出在您的头文件上。

你必须把 在 mysoapserver .cpp 文件中:

#include "datalayer.h"


并在 mysoapserver.h 头文件中放置:

class DataLayer;

解释:

错误未解析符号指的是数据层对象,因为文件 mysoapserver.cpp 不知道数据层甚至是一个东西。 至少根据你为MySoapServer发布的内容.cpp

您还需要添加到mysoapserver.cpp

#include "mysoapserver.h"
相关文章: