c++ - 如何在qt c++中重载子类中的父类(super class)方法

标签 c++ qt inheritance

我的父类(super class)是 Materials,FictionSection 类继承了 Materials 类。我正在尝试向数据库中插入一条记录。我创建了单独的类来处理用户界面和处理 mysql 查询。 materialinner.cpp中的addMaterials()在fictioninner.cpp中被重载。为了处理图形界面使用了fictionsection.cpp。为了实现插入方法,使用了 functioninner.cpp。项目编译后出现以下错误。

H:\c++Prac\Libro\fictioninner.cpp:33: error: invalid operands of types 'const char*' and 'const char [4]' to binary 'operator+'
                  "values('"+ id +"','"+ copies +"','"+ shelf +"','"+ editn +"')");
                              ^

Material .h

#ifndef MATERIALS_H
#define MATERIALS_H

#include <QMainWindow>
#include "materialinner.h"

class FictionSection;
class JournalSection;



namespace Ui {
class Materials;
}

class Materials : public QMainWindow, public MaterialInner
{
    Q_OBJECT
private:
    Ui::Materials *ui;
    FictionSection *fic ;
    JournalSection *journal;
    //StaffDashboard *dashbrd;

};

#endif // MATERIALS_H

materialinner.h

#ifndef MATERIALINNER_H
#define MATERIALINNER_H

#include<QString>
#include "databaseconnection.h"
#include "validation.h"

class MaterialInner : public DatabaseConnection, public Validation
{
public:
    MaterialInner();
  //  MaterialInner(QString,QString,QString,int,QString,QString);

    QString title,fname,lname,category,publisher,cost;
    int id;
    bool addMaterials(QString,QString,QString,QString,QString,QString);
    bool updateMaterials(QString,QString,QString,QString,QString,QString);
    bool deleteRecords(QString);
    bool flag;

private:


};

#endif // MATERIALINNER_H

Material .cpp

#include "materials.h"
#include "ui_materials.h"
#include "fictionsection.h"
#include "journalsection.h"

#include <QDebug>
#include <QMessageBox>

Materials::Materials(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Materials)
{
    ui->setupUi(this);
   // QObject ::connect(actionFiction_section,SIGNAL(triggered()),this,SLOT(on_actionFiction_section_triggered()));
}

Materials::~Materials()
{
    delete ui;
}

void Materials::on_btnAdd_clicked()
{


     QString title = ui->lneditTitle->text();
     QString fnme = ui->lneditFnme->text();
     QString lnme = ui->lneditLnme->text();
      QString cost = ui->lneditCost->text();
     // int csts = cost.toInt();

     QString pub = ui->lneditPub->text();
     QString categry = ui->cmbxCategry->currentText();

       MaterialInner mat ;
        dbConOpen();
   bool flag  = mat.addMaterials(title,fnme,lnme,cost,pub,categry);
       if(flag == true)
       {
           QMessageBox :: warning(this,"Save","Data Inserted successfully");
       }
       else
       {
          QMessageBox :: critical(this,"Error","Couldn't insert reords");
       }
       dbConClose();
}

materialinner.cpp

#include <QtSql>
#include <QMessageBox>
#include <QDebug>
#include "materialinner.h"

MaterialInner::MaterialInner()
{

}
/*MaterialInner :: MaterialInner(QString title, QString fname, QString lname, int cost, QString publisher, QString category)
{
    this->title = title;
    this->fname = fname;
    this->lname = lname;
    this->cost = cost;
    this->publisher = publisher;
    this->category = category;
}*/
bool MaterialInner :: addMaterials(QString ttle, QString fnme, QString lnme,QString cst, QString pub, QString cat)
{
  // MaterialInner(ttle,fnme,lnme,cst,pub,cat);
   QSqlQuery query ;


  flag = query.exec("insert into book ( material_title,auth_fname,auth_lname,cost,publisher,category )"
                    " values ('"+ttle+"','"+ fnme+"','"+lnme+"','"+cst+"','"+pub+"','"+cat+"')");
  return flag;

}

小说节.h

#ifndef FICTIONSECTION_H
#define FICTIONSECTION_H

#include <QMainWindow>
#include"materials.h"
#include "fictioninner.h"

    namespace Ui {
    class FictionSection;
    }

    class FictionSection : public QMainWindow,public FictionInner
    {
        Q_OBJECT

    public:
        explicit FictionSection(QWidget *parent = 0);
        ~FictionSection();

    private slots:
        void on_btnAdd_clicked();

    private:
        Ui::FictionSection *ui;
    };

    #endif // FICTIONSECTION_H

小说内部.cpp

#include <QtSql>

#include "fictioninner.h"

FictionInner::FictionInner()
{

}
bool FictionInner :: addMaterials(int id, int copies,int shelf, int editn)
{
    QSqlQuery query;
   bool flag = query.exec("insert into fiction (material_id,no_of_cpy,shelf_num,edition)"
                 "values('"+ id +"','"+ copies +"','"+ shelf +"','"+ editn +"')");
     return flag;
}

小说节.cpp

#include <QMessageBox>
#include "fictionsection.h"
#include "ui_fictionsection.h"


FictionSection::FictionSection(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::FictionSection)
{
    ui->setupUi(this);
}

FictionSection::~FictionSection()
{
    delete ui;
}

void FictionSection::on_btnAdd_clicked()
{
    //Accepting user entered values
 QString id = ui->cmbxId->currentText();
 int matId;
 if(!id.isEmpty())
 {
   matId = id.toInt();
 }
 QString copies = ui->lneditCopies->text();
 int numOfCpy;
 if(!copies.isEmpty())
 {
   numOfCpy = copies.toInt();
 }
 int shelfNo = ui->spinbxShelf->value();
 int edition = ui->spinbxEditn->value();
 dbConOpen();
 flag = addMaterials(matId,numOfCpy,shelfNo,edition);
 if(flag == true)
 {
      QMessageBox :: information(this,"Save","Data Inserted successfully", QMessageBox ::Ok);
 }
 else
 {
     QMessageBox :: critical(this,"Save","Data Inserted successfully");
 }
 dbConClose();
}

尽管我尝试了很多次查找错误,但还是找不到。先感谢您 如果我使用 query.bindValue() 是否正确?

bool FictionInner :: addMaterials(int id, int copies, int shelf, int editn)
{
    QSqlQuery query;
  //  QString string = QString("values ('") +QString :: number(id) +"','"+ QString ::number(copies)+"','"+ QString ::number(shelf)+"','"+ QString ::number(editn) '" ");
   bool flag = query.exec("insert into fiction (material_id,no_of_cpy,shelf_num,edition)"
                 "values(:matId, :cpy, :shlf, :edtn)");
   query.bindValue(":matId",id);
   query.bindValue(":cpy",copies);
   query.bindValue(":shlf",shelf);
   query.bindValue(":edtn",editn);
     return flag;
}

最佳答案

对于一个简单的错误,这是很多不相关的代码。消息真正说明了一切的简单错误。

问题是您根本无法像您那样连接字符串。首先,您不能将字符串文字与其他字符串文字“相加”,其次,添加字符串文字和整数不会达到您预期的效果。

因为你使用 Qt 你可以使用 QStringQString::number动态构建字符串。

例子

QString string = QString("values('") + QString::number(id) + "','" + ...; 

请注意,一旦你有了一个 QString 对象,编译器将自动找到从字 rune 字到 QString 的正确转换,因此只有第一个字符串文字需要是一个 QString 对象。


关于将整数添加到字符串文字的问题。字符串文字是一个只读字符数组。对于任何数组 ainteger 索引 i 表达式 a[i] 等同于 * (a + i)。现在从这里我们可以很容易地看出,向字符串文字添加一个整数只是向字符串添加一个偏移量并给出指向该偏移量的指针。

例子:

char foo[] = "hello world";
puts(foo);  // Prints "hello world\n"
puts(foo + 6);  // Prints "world\n"

在上面的例子中,"world"中的'w'在字符串中的第七个位置,即索引6。

关于c++ - 如何在qt c++中重载子类中的父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34118850/

相关文章:

c++ - 汇编操作的时间

c++ - 如何解析文件路径

linux - 在 Linux 上使用 creationComplete 事件将函数注册为闪存回调失败

c++ - 错误 "token is not a valid binary operator in a preprocessor subexpression"

c# - Extended Controller 构造函数没有 User 的实例

c++ - 对象和静态位置之间的堆比较

c++ - 使用 C++ 生成器获取 swf 文件的帧速率

c++ - 在没有特殊库的情况下验证 C++ 中的 float

C++ 泛型类和继承

Ruby 类继承以及如何避免调用 super 两次