2010-01-12 78 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