Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Возврат значений из функции


Автор: ioManip 22.9.2013, 06:24
Здравствуйте! Подскажите, как вернуть из функции более одного значения?(при помощи ссылок)
Если можно с примерчиком)

Автор: Фантом 22.9.2013, 12:47
Проще сразу привести примерчик - функцию scanf. Она именно это и делает.

Автор: akizelokro 22.9.2013, 19:31
Наиболее известный для постSTL'ного поколения С++-программистов пример возврата значения по ссылке - переопределение оператора "<<" в потоках.
Вернуть более одного значения С/C++ не может. Но гибкость языка позволяет решать эту задачу косвенными способами:
-изменять значения объектов, переданных в функцию по указателю или по ссылке
-глобальные переменные
-либо переменные в области видимости (пример - функция-метод класса изменяет значения членов класса-данных
-возвращать объект (юнион, класс, структуру, массив, выделенную область памяти, заполненую и т.д.), либо указатель на подобный объект, либо посредством ссылки на объект.
Так что нужно именно?

Автор: volatile 22.9.2013, 21:51
Цитата(ioManip @  22.9.2013,  06:24 Найти цитируемый пост)
как вернуть из функции более одного значения?

можно еще так, прямо в лоб
Код

struct ret_val {
   ret_val (int v1, int v2) : v1(v1), v2(v2) {} 
   int v1;
   int v2;
};

ret_val my_func ()
{
   return ret_val (7, 13); // возвращаем 2 значения
}

Автор: volatile 22.9.2013, 22:18
Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair

Автор: feodorv 22.9.2013, 22:23
Цитата(akizelokro @  22.9.2013,  20:31 Найти цитируемый пост)
Так что нужно именно?

Цитата(ioManip @  22.9.2013,  07:24 Найти цитируемый пост)
при помощи ссылок


Код

int func( int& v1, int& v2)
{
  v1 = 1;
  v2 = 2;
  return 0;
}

?

Автор: akizelokro 23.9.2013, 00:38
Цитата(feodorv @  22.9.2013,  22:23 Найти цитируемый пост)
Цитата(akizelokro @  22.9.2013,  20:31 Найти цитируемый пост)
Так что нужно именно?


Написано, как вернуть из функции. Я и поинтересовался. Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.

Автор: akizelokro 23.9.2013, 02:15
Цитата(volatile @  22.9.2013,  22:18 Найти цитируемый пост)
Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair 


Это понятно. Как и то, что до 10 значений в С++11 можно вернуть через std::tuple.
Либо, кажись так (хоть в любом случае, ни std::tuple, ни вариант ниже формально не возвращение нескольких значений по ссылке)

Код

struct ret_val {
   int v1;
   int v2;
};
ret_val& my_func (ret_val & rv)
{
   rv.v1 = 3;
   rv.v2 = 7;
   return rv; // возвращаем 2 значения
}


Но я так и не понял, что именно нужно из самого вопроса.

Автор: ioManip 23.9.2013, 04:34
Цитата(akizelokro @  23.9.2013,  02:15 Найти цитируемый пост)
Но я так и не понял, что именно нужно из самого вопроса.

Вот как написано в задании: "Функция должна возвращать несколько значений, для этого использовать ссылки". 

Цитата(akizelokro @  22.9.2013,  19:31 Найти цитируемый пост)
Вернуть более одного значения С/C++ не может.

Я тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам.

Автор: akizelokro 23.9.2013, 05:05
Цитата(ioManip @  23.9.2013,  04:34 Найти цитируемый пост)
 тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам. 


Сделай и так, и так одновременно, если там больше ничего нет более подробного (примеров каких-то или дополнительных условий). Передавай два аргумента в функции по ссылке, значения двух из них меняй в функции, а одно из них навроде предложения volatile. Потому что я не думаю, что там говорится о том, чтобы функция возвращала результат-временную переменную, приравнивая её значение константной ссылке навроде.. траляля-тополя.

Вообщем, я тебе ещё больше могу только усложнить, http://c-p-p.info/index.php/cpp-oop/%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8/188-%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B5



Автор: feodorv 23.9.2013, 05:16
Цитата(akizelokro @  23.9.2013,  01:38 Найти цитируемый пост)
Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.

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

Автор: akizelokro 23.9.2013, 05:34
Цитата(feodorv @  23.9.2013,  05:16 Найти цитируемый пост)
Цитата(akizelokro @  23.9.2013,  01:38 Найти цитируемый пост)
Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.

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


Я не придираюсь, я просто переспросил. Меня вдруг в памяти что-то торкнуло, что там что-то есть ещё. А дальше мне поставили минус за вроде бы правильно написанный спич и в любом случае, я долго не работал, и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства. 

Автор: feodorv 23.9.2013, 08:52
Цитата(akizelokro @  23.9.2013,  06:34 Найти цитируемый пост)
и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства

 smile Это да, когда я впервые познакомился с этим трюком, было приблизительно так, как описано http://dox.sbnet.ru/publications/ccoding.ru.html:
Цитата
метод, стоящий слева от знака равенства, обычно повергает человека, читающего код, в пятиминутное шоковое состояние.
 Статья 95-го года, а сейчас-то все с этим трюком знакомы smile 

Автор: akizelokro 23.9.2013, 16:38
Ладно, чёрт с ним с минусиком, у меня задачи другие. 

Цитата(feodorv @  23.9.2013,  08:52 Найти цитируемый пост)
 Статья 95-го года, а сейчас-то все с этим трюком знакомы

Я как увидел, заулыбался, вот, думаю, будет забавная шняга  smile 

По поводу вопроса. Я ещё нашёл два источника, в котором как термин фигурирует "возвращение значения по ссылке". Как я понял, это что-то народе вида

Код

ret_val& my_func (ret_val & rv)
или
ret_val& my_func ()

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

Автор: feodorv 24.9.2013, 15:59
Цитата(akizelokro @  23.9.2013,  17:38 Найти цитируемый пост)
Осталось только определить, действительно ли так воспринимает этот термин составитель задачи.

Думаю, что нет, поскольку не "по ссылке", а
Цитата(ioManip @  22.9.2013,  07:24 Найти цитируемый пост)
при помощи ссылок


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)