• 4568阅读
  • 12回复

[提问]明明幾乎就照抄還是一直報錯,救命啊 到底哪裡有問題? [复制链接]

上一主题 下一主题
离线harold00124
 

只看楼主 倒序阅读 楼主  发表于: 2016-10-26
以前學生時代有接觸一些C++
後來出去工作幾年後基本上都忘了大半
現在剛換工作開始重新接觸C++
老闆培訓要我在下個月內用QT寫出一個簡單的計算器

然後我上GOOGLE找
https://dotblogs.com.tw/pin0513/2010/01/08/12930
拿這個範例當作模仿練習
幾乎都照抄了 一邊抄一邊盡量理解裡面的意思 

希望自己吃透之後可以自己做一個功能更豐富的 但是卡住了

一直報錯無法執行
弄完一個又一個出來

error: prototype for 'double MainWindow::Exec(double, int, double)' does not match any in class 'MainWindow'
double MainWindow::Exec(double value1,int op,double value2){
              ^

error: candidate is: double MainWindow::Exec(int, int, int)
     double Exec(int value1,int op,int value2);
                  ^

而且裡面還有一些東西我還看不太懂得,
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QComboBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:

    void on_doubleSpinBox1_valueChanged(double value);

    void on_doubleSpinBox2_valueChanged(double value);

    void on_comboBox_currentIndexChanged(int index);

private:
    Ui::MainWindow *ui;
    double Exec(int value1,int op,int value2);
};


#endif // MAINWINDOW_H
-------------------------------------------------------------------------

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QComboBox>
#include <QMessageBox>
#include <QString>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(on_comboBox_currentIndexChanged(int)));
   ui->comboBox->addItem(tr("Choose"));
   ui->comboBox->addItem(tr("+"));
   ui->comboBox->addItem(tr("-"));
   ui->comboBox->addItem(tr("*"));
   ui->comboBox->addItem(tr("/"));

   if(ui->comboBox->currentIndex()==3 && ui->doubleSpinBox2->value()==0){  //為什麼currentIndex是訂為==3 到底是怎麼判斷牠的序列的??
就算從上面的addItem從上從下數都不會是除式阿
       QMessageBox::information(this,tr("錯誤"),tr("除數請勿為0"));//為什麼他要使用tr 我在其他單項使用MessageBox的時候都是直接"文字"就好 有什麼意義嗎?
   }
   else{
     ui->label->setText(QString::number(
                            Exec(
       ui->doubleSpinBox1->value(),
       ui->comboBox->currentIndex(),
       ui->doubleSpinBox2->value())));


   }
}
MainWindow::~MainWindow()
{
    delete ui;
}
double MainWindow::Exec(double value1,int op,double value2){  //為什麼他在標頭檔定義3個變數是int int int 跑到這邊卻變double int double了
    double result;
    switch (op) {
    case 1:
        result = value1+value2;
        break;
    case 2:
        result = value1-value2;
        break;
    case 3:
        result = value1*value2;
        break;
    case 4:
        result = value1/value2;
        break;
    }
    return result;

}




不好意思 我覺得我問的一定是個蠢問題 但是已經整個卡住2.3天沒辦法解決現在很著急 手頭上現在也沒有什麼工具書可以翻的 現在自學完全靠網路 但是資料很雜很難找有整理過的答案(就算有可能是英文的我看不懂)



离线gnibuoz

只看该作者 1楼 发表于: 2016-10-26
1. tr可以去掉,你直接写文字也没有任何问题,关于tr的用法,建议你在帮助文档里边搜索下,这个是为了方便国际化的,不过一般的程序其实用不到这个
2.修改下头文件中的函数声明,参数类型改成和源文件中一致
1条评分金钱+1
harold00124 金钱 +1 感謝回應!! 2016-10-26
我就是我,颜色不一样的烟火...
离线rotung

只看该作者 2楼 发表于: 2016-10-26
......
if(ui->comboBox->currentIndex()==3 && ui->doubleSpinBox2->value()==0){  //為什麼currentIndex是訂為==3 到底是怎麼判斷牠的序列的??
......

currentIndex==3明显是错误的,应该是currentIndex()==4.   从Exec函数的具体实现也可以看到第4个才是除式。
1条评分金钱+1
harold00124 金钱 +1 感謝回應!! 2016-10-26
离线bran_lee

只看该作者 3楼 发表于: 2016-10-26
1、一开始那个错误是头文件和源文件函数不一致,按返回类型是double来看,你应该改头文件的函数声明
2、currentIndex如2楼所说
3、关于tr,如1楼所说用于国际化,tr里的字符串是可以通过加载不同的翻译文件来改变的,具体用法自己研究。不过良好的习惯应该是界面显示的文字都应该用tr,我们做项目代码中是不会直接使用中文字符串的,都是后期翻译成中文。
1条评分金钱+1
harold00124 金钱 +1 感謝回應!! 2016-10-26
当你只有锤子时,你看什么都像是钉子!
离线harold00124

只看该作者 4楼 发表于: 2016-10-26
非常感謝樓上三位的回答
currentIndex的部分已經弄懂了 原來我被錯誤的文章給誤導了 害我卡半天在那邊想
宣告部分我直接全部給他標頭跟cpp都用double....


#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QComboBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:

    void on_doubleSpinBox1_valueChanged(double value);

    void on_doubleSpinBox2_valueChanged(double value);

    void on_comboBox_currentIndexChanged(int index);

private:
    Ui::MainWindow *ui;
    double Exec(double value1,double op,double value2); //<===全部都弄成double
};


#endif // MAINWINDOW_H


----------------------------------------

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QComboBox>
#include <QMessageBox>
#include <QString>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(on_comboBox_currentIndexChanged(int)));
   ui->comboBox->addItem(tr("Choose"));
   ui->comboBox->addItem(tr("+"));
   ui->comboBox->addItem(tr("-"));
   ui->comboBox->addItem(tr("*"));
   ui->comboBox->addItem(tr("/"));

   if(ui->comboBox->currentIndex()==4 && ui->doubleSpinBox2->value()==0){ //<====我改成4了 感謝大家
       QMessageBox::information(this,"錯誤","除數請勿為0");
   }
   else{
     ui->label->setText(QString::number(
                            Exec(
       ui->doubleSpinBox1->value(),
       ui->comboBox->currentIndex(),
       ui->doubleSpinBox2->value())));


   }
}
MainWindow::~MainWindow()
{
    delete ui;
}
double MainWindow::Exec(double value1,double op,double value2){ //<========我只把這邊修改成跟標頭檔一樣的double
    double result;
    switch (op) {
    case 1:
        result = value1+value2;
        break;
    case 2:
        result = value1-value2;
        break;
    case 3:
        result = value1*value2;
        break;
    case 4:
        result = value1/value2;
        break;
    }
    return result;

}

我原本是想用double int double在標頭與後面的主程式做統一宣告 但是按執行之後報錯更多 所以我後來就乾脆統一都double好了

但是解決宣告問題之後還是有報錯

error: switch quantity not an integer
    switch (op) {
                 ^

報錯內容說他不是整數 這樣我已經被搞迷糊了 我既不能把op的宣告改成int ,switch又不允許我用非整數??
還是我還需要再加上什麼轉換方式才能讓他正常使用??

我還嘗試用switch (ui->comboBox->currentIndex())的方式 但是還是沒辦法
不好意思 我基礎不是很穩 其實我從收到第一篇回文就開始測試了 但是2個多小時過去還是一堆問題自己想不出個解決方法




离线bran_lee

只看该作者 5楼 发表于: 2016-10-26
回 harold00124 的帖子
harold00124:非常感謝樓上三位的回答
currentIndex的部分已經弄懂了 原來我被錯誤的文章給誤導了 害我卡半天在那邊想
宣告部分我直接全部給他標頭跟cpp都用double....
....... (2016-10-26 15:58)

c++里的switch不能用double型,只能用int型(包括其他整型)或者enum型

1条评分金钱+1
harold00124 金钱 +1 感谢回复!! 2016-10-26
当你只有锤子时,你看什么都像是钉子!
离线cycloveu

只看该作者 6楼 发表于: 2016-10-26
你是台湾人 还是香港人啊 能不能打简体字啊  繁体字看着累啊
大道至简 悟在天成
离线harold00124

只看该作者 7楼 发表于: 2016-10-26
回 bran_lee 的帖子
bran_lee:c++里的switch不能用double型,只能用int型或者enum型
 (2016-10-26 16:05) 

這樣我是不是不該用switch 而是用if else的方式來編寫會比較好?
离线harold00124

只看该作者 8楼 发表于: 2016-10-26
回 cycloveu 的帖子
cycloveu:你是台湾人 还是香港人啊 能不能打简体字啊  繁体字看着累啊 (2016-10-26 16:06) 

你好 不好意思造成你的困擾,我是台灣人,初來此地請教 還請多包涵
离线bran_lee

只看该作者 9楼 发表于: 2016-10-26
回 harold00124 的帖子
harold00124:這樣我是不是不該用switch 而是用if else的方式來編寫會比較好? (2016-10-26 16:07)

你还是把op改成int型吧,if else是可以,但从编程习惯上,从各值中选其一的这种操作用switch逻辑更清晰更规范些,其实最好是用enum类型的,练习项目就无所谓了
1条评分金钱+1
harold00124 金钱 +1 感谢回复!! 2016-10-26
当你只有锤子时,你看什么都像是钉子!
离线stlcours

只看该作者 10楼 发表于: 2016-10-26
离线harold00124

只看该作者 11楼 发表于: 2016-10-27
非常感謝各位大能的指導
小弟後來跟老闆請教,老闆叫我直接用else if就好叫我不要鑽牛角尖

現在碰到一些問題 在於除數為0的排錯問題

void MainWindow::on_pushButton_clicked()
{
    double op;
    int calcul =ui->comboBox->currentIndex();
    if(calcul==3 && ui->spinBox_2==0 ){
        QMessageBox::information(this,"錯誤","除數請勿為0");
    }
    else if(calcul==0){
        op=ui->spinBox->value()+ui->spinBox_2->value();
        ui->lineEdit->setText(QString::number(op));

    }
    else if(calcul==1){
        op=ui->spinBox->value()-ui->spinBox_2->value();
        ui->lineEdit->setText(QString::number(op));

    }
    else if(calcul==2)
    {
        op=ui->spinBox->value()*ui->spinBox_2->value();
        ui->lineEdit->setText(QString::number(op));

    }
    else if(calcul==3)
    {
        op=ui->spinBox->value()/ui->spinBox_2->value();
         ui->lineEdit->setText(QString::number(op));

    }
}


很神奇的是我正常做四則運算的時候程式都能正常執行

但是當我刻意把除數為0的時候 排錯程序卻沒發揮作用 而是直接出錯關閉程序

整個人都被搞迷糊了 最先前面的if都沒通過怎麼可能會跑到下面的運算式那邊....
离线harold00124

只看该作者 12楼 发表于: 2016-10-27
喔靠 發文之後才發現自己的問題
calcul==3 && ui->spinBox_2->value()==0

忘了+value拉 我真笨
快速回复
限100 字节
 
上一个 下一个