Хорошо, поэтому я посмотрел в Интернете и, очевидно, моя проблема в том, что я использую переменную "val" здесь, которая перестает существовать, когда функция закрывается. К сожалению, я действительно не нашел реальных решений для моей проблемы. Я уверен, что это достаточно простая проблема, чтобы решить, как только вы знаете, но я просто не знаю.
В этом коде просто заметьте, что я пытаюсь вернуть unsigned int val. Я не могу этого сделать, потому что код хочет ссылку, а не только переменную. Я не могу просто вернуть val, но я не знаю, что делать.
http://i.imgur.com/E8sf2aS.png
Спасибо за помощь.
Редактировать: извините, у меня были некоторые проблемы с изображением, видимо, мне нужно работать над своим представителем.
У этого кода много проблем, кроме как в изображении (!!!)
Наверное, вы пытаетесь найти элемент в позиции pos-1
в списке или что-то в этом роде. Основная проблема, связанная с вашим вопросом, состоит в том, что вы сначала назначаете val
по значению, тогда у вас нет ссылки на return. Вы должны сразу вернуть значение n2->value
, которое должно быть ссылкой на unsigned int
, например:
const unsigned int &list::operator[](unsigned int pos) const
{
node *n1 = ???, *n2 = ???;
for (unsigned int k = 0; k < _size; k++)
{
if (k == pos)
return n2->value;
n1 = n2->next;
n2 = n1;
}
return ???;
}
Остаются проблемы, например
почему вам нужен два node*
а не один (поиск позиции pos-1
напрямую)
как инициализировать n1, n2
(как-то указывая на заголовок вашего списка, очевидно, new node()
не должен работать)
что вернуть, если входной аргумент pos
находится вне допустимого диапазона (возможно, верните ссылку на какую-либо статическую переменную, которую вы можете обнаружить или выбросить исключение)
Для этих проблем вам понадобится больше контекста с вашей стороны.
Я собираюсь угадать.
Foo& doStuff()
{
// blah blah
Foo val;
// ...
return val;
// val is no longer valid end of scope. Returning invalid reference.
}
Либо передайте в результате экземпляр Foo
на doStuff, либо создайте new
Foo в куче и верните в качестве указателя.
Так,
void doStuff(Foo& val)
{
// blah blah
// ...
val = x;
}
или
Foo* doStuff()
{
// blah blah
Foo* val = new Foo; // dont forget to delete
// ...
return val;
}
Конечно, вы можете вернуться по значению:
Foo doStuff()
{
// blah blah
Foo val;
// ...
return val;
}
В зависимости от того, насколько тяжелен Foo. Конечно, так как в этом случае Foo
- это просто небольшой int
, вы должны просто вернуться по значению. Для некоторых случаев возврата по значению для больших/нетривиальных типов создается временная копия (в тех случаях, когда отсутствует копирование с помощью RVO или NRVO); в этих случаях вам может потребоваться избегать возврата больших типов объектов по значению.
Foo
по значению.
Справочные переменные действительны только в том случае, если объект, к которому относится ссылка, существует в памяти. Передача ссылок на переменную вне области видимости считается неопределенным поведением. Это ошибка в вашем коде. Пожалуйста, исправьте это.
const unsigned int& list::operator[] (unsigned int pos)const
{
const unsigned int val = 0;
return val; //this is a local variable, whose scope ends here, a reference to this should not be returned
}
Это предупреждение компилятора для вашего кода.
warning: reference to local variable ‘val returned [enabled by default]
Пожалуйста, прислушайтесь к предупреждениям компилятора (особенно c/c++ !!), в вашем случае просто используя pass by value, было бы достаточно.
Редактировать:
В случае, если возвращаемая переменная используется как ссылочный тип, и ее нельзя избежать, вы можете продлить жизнь вашей локальной переменной на протяжении всего существования программы, сделав ее статической.
const unsigned int& list::operator[] (unsigned int pos)const
{
static const unsigned int val = 0;
return val;
}
Th переменная val теперь статическая локальная переменная, жизнь которой во всей программе, поэтому обход вокруг ссылок на эту переменную должен быть в порядке, но не рекомендуется программировать, так как пропуск по значению будет достаточным для нужд вашего приложения.
val
, а в определении самого val
. То, что должно быть возвращено, это n2->value
напрямую, которое должно быть ссылкой на некоторый элемент списка (см. Мой ответ).