Работа со ссылочными переменными в C ++

0

Хорошо, поэтому я посмотрел в Интернете и, очевидно, моя проблема в том, что я использую переменную "val" здесь, которая перестает существовать, когда функция закрывается. К сожалению, я действительно не нашел реальных решений для моей проблемы. Я уверен, что это достаточно простая проблема, чтобы решить, как только вы знаете, но я просто не знаю.

В этом коде просто заметьте, что я пытаюсь вернуть unsigned int val. Я не могу этого сделать, потому что код хочет ссылку, а не только переменную. Я не могу просто вернуть val, но я не знаю, что делать.

http://i.imgur.com/E8sf2aS.png

Спасибо за помощь.

Редактировать: извините, у меня были некоторые проблемы с изображением, видимо, мне нужно работать над своим представителем.

Теги:
variables
reference
local

3 ответа

1

У этого кода много проблем, кроме как в изображении (!!!)

Наверное, вы пытаетесь найти элемент в позиции 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 находится вне допустимого диапазона (возможно, верните ссылку на какую-либо статическую переменную, которую вы можете обнаружить или выбросить исключение)

Для этих проблем вам понадобится больше контекста с вашей стороны.

  • 0
    +1 Этот ответ пытается разобраться с действительным кодом ОП.
  • 0
    Спасибо за ответ, мой код работает нормально, у меня есть версия, которая возвращает переменные вместо ссылки, которая проходит кучу тестов (хотя ваш третий пункт верен, я с тех пор изменил это. Все, что я хочу знать, это Как я могу получить const unsigned int хранится в "n2-> значение", возвращаемое функцией. Должен ли я сделать глобальную переменную и вернуть ее? Должен ли я сделать глобальную переменную и вернуть указатель на нее? Как я могу вернуть значение хранится в n2-> значение по ссылке?
Показать ещё 1 комментарий
1

Я собираюсь угадать.

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); в этих случаях вам может потребоваться избегать возврата больших типов объектов по значению.

  • 0
    Вы пропустили самое очевидное и чистое решение: вернуть Foo по значению.
  • 0
    Да, хорошая мысль. Имейте в виду, я начал писать это перед ссылкой на код в вопросе.
1

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

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 теперь статическая локальная переменная, жизнь которой во всей программе, поэтому обход вокруг ссылок на эту переменную должен быть в порядке, но не рекомендуется программировать, так как пропуск по значению будет достаточным для нужд вашего приложения.

  • 0
    Я думаю, что проблема не в том, как вернуть val , а в определении самого val . То, что должно быть возвращено, это n2->value напрямую, которое должно быть ссылкой на некоторый элемент списка (см. Мой ответ).
  • 0
    Я не видел в логике программы, это исправление основных понятий аскера в c ++ ..... Аскер думает, что он может передать ссылку на любую локальную переменную ,,, это неправильно ... Сначала концепции, все остальное приходит позже :)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню