2015-06-16 44 views
0

所以即時製作這個貨幣計算器,我遇到了一些麻煩,比較我的組合框和存儲貨幣匯率的地圖中選擇的值。比較Map鍵和comboBox.currentText()時應用程序崩潰;

(我不會張貼在地圖插入物和組合框的代碼更speciffic,假設他們arent空。)

的.cpp

class Calculator : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Calculator(QMap <QString, double> &my_map,QObject *parent = 0); 

    void get_value(); 

private: 
    Ui::MainWindow *ui; 
    QMap <QString, double> *map_pointer; 

signals: 


public slots: 

}; 

.H

Calculator::Calculator(QMap<QString, double> &my_map, QObject *parent) : 
    QObject(parent) 
{ 
    map_pointer=&my_map; 

} 

void Calculator::get_value() 
{ 

    QMap<QString, double>::Iterator i; 

    qDebug()<< "im in get_value"; 

    for(i=map_pointer->begin(); i !=map_pointer->end();i++) 
     if(i.key()==ui.>comboBox->currentText()) 
      qDebug()<<i.key() << ": " << i.value(); 


} 

該應用if語句與「意外完成」崩潰

和我的主要

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QMap<QString,double> currency_map; 

    MainWindow w(currency_map); 
    w.show(); 

    Calculator c(currency_map); 
    c.get_value(); 
    return a.exec(); 
} 
+0

在你的代碼都出現了,你不計算器分配'ui'。如果它沒有發佈,你沒有發佈,它沒有初始化,並導致崩潰 –

+0

你是對的,但如何創造者提供我comboBoxes和所有其他的東西,我在我的主窗口中,當我做ui-> 以及你如何建議我將主窗口變量分配給* ui? – user3219947

回答

1

成員ui未初始化,因此在訪問時會導致未定義的行爲。在你的情況下,應用程序崩潰。

在訪問它之前,您必須將指針初始化爲Ui::MainWindow的實例。一個簡單的方法是通過構造函數中的窗口,如下所示:

// in .h 
explicit Calculator(QMap <QString, double> &my_map, Ui::MainWindow *window, QObject *parent = 0); 

// in .cpp 
Calculator::Calculator(QMap<QString, double> &my_map, Ui::MainWindow *window, QObject *parent) : 
QObject(parent) 
{ 
    map_pointer=&my_map; 
    ui = window; 
} 

但是,我建議您重新構造您的程序。讓您的計算器依賴於GUI是不好的設計。相反,你應該一個參數添加到get_value方法,像這樣:

void Calculator::get_value(QString value) { 
    for(QMap<QString, double>::Iterator i = map_pointer->begin(); i != map_pointer->end(); ++i) { 
     if(i.key() == value) { 
      qDebug()<<i.key() << ": " << i.value(); 
     } 
    } 
} 

並調用這個函數的時候傳遞ui->comboBox->currentText()值。

創建者的自動完成機制會提示ui的所有成員,因爲它被定義爲指向Ui::MainWindow實例的指針。這意味着,你可以通過訪問它的成員,如果它指向一個實例。但是,它不會檢查程序是否在運行時正確初始化指針。

你可以使用像Valgrind的代碼分析工具,它會指出這些問題

+0

非常感謝您的詳細解釋。 生病請確保按照您的建議檢查valgrind。 – user3219947