2013-09-18 4 views
1

У меня есть QStandardItem * список в моем кодеПреобразование поплавок плавать *

QList<QStandardItem*> lst 

Теперь это допустимо, и работает

float a = lst[0]->text().toFloat(); 

Однако следующее не работает

float* a = &(lst[0]->text().toFloat()); 

Я получаю сообщение об ошибке intellisense с указанием

Выражение должно быть именующим или функция целеуказателем

мне нужен указатель здесь, так как я использую внешнюю библиотеку, которая требует ссылки, которая выглядит, как этот

some_class.add_variable(const std::string& variable_name, float& t); 

Так что, если я получаю указатель Я мог бы просто передать его как * a

Любые предложения относительно того, как я мог решить эту проблему?

+0

не существует связи между функцией, ожидающей * reference *, и вам требуется разыменовать указатель – brunocodutra

+0

Если это действительно сработало, на что указывает указатель? Подумайте об этом, нет 'float' для' float * 'для указания. (Если бы было, какова была бы его область?) –

ответ

3

Правая сторона - это так называемый временный. Это объект, который не будет существовать после окончания текущего выражения. По понятным причинам вы не можете взять адрес времен; после окончания выражения у вас будет неправильный указатель.

Что вы могли бы сделать это:

float a = lst[0]->text().toFloat(); 
float* aPtr = &a; 

Это будет безопасно сделать копию временного значения (или в C++ 11, он может move временный), а затем вы можете получить ссылку к вашей локальной, не временной переменной.

+0

однако я бы хотел, чтобы aPtr оставался действительным после окончания действия функции. В случае ур aPtr не будет работать после того, как закончится область действия – MistyD

+0

@MistyD Сделайте все, что вы обычно делаете, чтобы сохранить указатель действительным. 'malloc' и скопируйте значение там, сделайте его переменной класса или глобальной переменной и т. д. –

+0

@MistyD Вероятно, вы не хотите, чтобы этот указатель был действительным очень долго, поскольку значение' lst [0] - > text' может измениться, и указанное значение не отразится на этом. –

2

Используйте float a = lst[0]->text().toFloat(); и просто передайте его как &a в библиотеку функции.

+0

Я не хочу этого делать, поскольку 'a' находится в локальной области, а lst [0] -> text(). ToFloat() находится в глобальной области – MistyD

+0

@MistyD Я не знаю Понимаете, почему это проблема. –

+0

@MistyD Это не имеет значения для последующих, синхронных вызовов функций! Здесь все будет хорошо. –

0

Принимая адрес временного значения, возвращаемого функцией, не будет работать. Это значение должно быть присвоено переменной lvalue.

Почему вы хотите, чтобы адрес поплавка вместо фактического значения?

Вы должны иметь дело только с адресами или указателями на значения, которые были где-то сохранены.

0

На самом деле, ваша внешняя функция НЕ нуждается в адресе, она принимает ССЫЛКУ, поэтому вам не нужен указатель.

Однако, если вам действительно нужно указатель на локальную переменную:

float x = something...; 
some_function(&x); 

даст вам то, что вы после этого.

0

Позаботьтесь: float* a = &(lst[0]->text().toFloat()); даст вам undefined поведение, если вы обратитесь к a, следуя этому утверждению.Это связано с тем, что анонимный временный (поплавок, возвращенный .tofloat()), будет выходить за рамки после утверждения, а a будет признан недействительным; i.e. не укажет ни на что значимое.

Вы должны написать float a = lst[0]->text().toFloat() и передать функцию &a. То есть, держите a в объеме до тех пор, пока вам это нужно.

+0

@MistyD - oops; typo ;-) – Bathsheba

+0

Ваш хороший. Спасибо за предложение – MistyD

Смежные вопросы