2010-01-12 82 views
4

我寫了這樣的事情:引用傳遞[C++],[Qt的]

class Storage 
{ 
public: 
    Storage(); 
    QString key() const; 
    int value() const; 
    void add_item(QString&,int); 
private: 
    QMap<QString,int>* my_map_; 
}; 

void Storage::add_item(QString& key,int value)//------HERE IS THE SLOT FOR ADDING 
{ 
    *my_map_[key] = value; 
} 

,當我試圖通過給項目添加到QMap

class Dialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    Dialog(QWidget* = 0); 
public slots: 
    void add_item() 
    { 
     strg_->add_item(ui->lineEdit->text(),ui->spinBox->value());//---HERE I'M "PASSING" TWO OBJECTS: QString AND int 
     ui->lineEdit->clear(); 
    } 

private: 
    Ui::Dialog* ui; 
    Storage* strg_; 
}; 

我越來越錯誤:

error: no matching function for call to 'Storage::add_item(QString, int) 
note: candidates are: void Storage::add_item(QString&, int) 

我該如何發送QString參考。那麼我現在呢? 謝謝。

回答

10

add_item應該將「const QString &」而不是「QString &」作爲參數。

+0

你能解釋一下爲什麼? – Rudy 2012-03-01 03:46:16

+1

@Rudy:因爲沒有理由'add_item'希望修改'QString'對象。 – Mehrdad 2012-03-01 03:52:52

0

的問題是,ui->lineEdit->text()似乎返回QString,而不是一個QString&

無法通過參考add_item功能通過這個,因爲它不存在任何地方,它只是由該函數返回的臨時副本。如果你聲明它在棧上,然後通過它像下面,它應該工作:

QString qs = ui->lineEdit->text(); 
strg_->add_item(qs,ui->spinBox->value()); 
+0

它可以通過const-reference來傳遞。 – 2010-01-12 12:03:35

+0

@Joe,是的,它只能解決此問題,而不是解決它。 – e8johan 2010-01-12 14:35:29

+0

@ e8johan沒有真正 – chikuba 2012-02-19 22:06:26

2

該行通過值返回的QString

ui->lineEdit->text(),ui->spinBox->value() 

因此,你不能把它作爲一個可修改的參考。但是,可以使用它作爲一個不可修改的(常數)參考,通過修改函數方法add_item採取const QString&

void Storage::add_item(QString key,int value) 
{ 
    *my_map_[key] = value; 
} 

...不過請注意,這通常與類它的很多更有效:

void Storage::add_item(const QString& key,int value) 
{ 
    *my_map_[key] = value; 
} 

另外,根據QString的實施,它可能只是按值傳遞同樣有效在可能的情況下使用const引用。

+0

Dzięki科內爾。 ;) – 2010-01-12 12:13:11