Передача по ссылке [C ++], [Qt] - PullRequest
4 голосов
/ 12 января 2010

Я написал что-то вроде этого:

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 по реф. другой тогда я делаю это сейчас? Спасибо.

Ответы [ 3 ]

10 голосов
/ 12 января 2010

add_item должен принимать в качестве параметра const QString &, а не QString &

2 голосов
/ 12 января 2010

Эта строка возвращает QString на значение

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

Следовательно, вы не можете использовать его в качестве изменяемой ссылки. Однако вы можете использовать его как неизменяемую (постоянную) ссылку, изменив функцию 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;
}

... заметьте, однако, что обычно с классами гораздо эффективнее использовать константные ссылки, где это возможно.

0 голосов
/ 12 января 2010

Проблема в том, что ui->lineEdit->text() возвращает QString, а не QString&.

Вы не можете передать это по ссылке на функцию add_item, потому что она нигде не существует, это просто временная копия, возвращаемая этой функцией. если вы объявите это в стеке, а затем передадите, как показано ниже, это должно сработать:

QString qs = ui->lineEdit->text();
strg_->add_item(qs,ui->spinBox->value());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...