通过引用传递[C ++],[Qt]

时间:2010-01-12 11:55:01

标签: 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)

我如何通过ref发送QString。其他然后我现在这样做? 谢谢。

3 个答案:

答案 0 :(得分:10)

add_item应该采用“const QString&amp;”而不是“QString&amp;”作为参数。

答案 1 :(得分:2)

此行按

返回QString
ui->lineEdit->text(),ui->spinBox->value()

因此,您不能将其用作可修改的参考。但是,您可以将其用作不可修改的(const)引用,方法是将add_item函数修改为const QString&

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

此外,根据QString的实现,通过值传递它可能同样有效:

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

...但请注意,通常使用类,在可能的情况下使用const引用会更有效。

答案 2 :(得分:0)

问题是ui->lineEdit->text()似乎返回QString而不是QString&

您不能通过引用add_item函数来传递它,因为它在任何地方都不存在,它只是该函数返回的临时副本。如果你在堆栈上声明它然后像下面那样传递它,它应该工作:

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