【问题标题】:How to overload a super class method in a subclass in qt c++如何在qt c ++中的子类中重载超类方法
【发布时间】:2016-03-11 04:29:03
【问题描述】:

我的超类是 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 +"')");
                              ^

材料.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

材料.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

fictioninner.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;
}

【问题讨论】:

    标签: c++ qt inheritance


    【解决方案1】:

    要克服上述错误,您可以使用 query.bindValue() 来阻止您将 int 输入值转换为字符串。

    bool FictionInner :: addMaterials(int id, int copies, int shelf, int editn)
    {
        QSqlQuery query;
    
        query.prepare("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);
       flag = query.exec();
         return flag;
    }
    

    【讨论】:

    • ...这个解决方案会自动转义字符串以防止 SQL 注入!
    【解决方案2】:

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

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

    由于您使用 Qt,您可以使用 QStringQString::number 动态构造字符串。

    例子

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

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


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

    例子:

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

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

    【讨论】:

    • 但我将虚构表中的记录存储为 int。那么如何修改我的代码来克服上述错误呢?
    • @user3279893 您确实点击了QString::number 函数的链接,并了解了它的作用?
    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多