Возврат значений из функции

 
0
 
C++
ava
ioManip | 22.09.2013, 07:24
Здравствуйте! Подскажите, как вернуть из функции более одного значения?(при помощи ссылок)
Если можно с примерчиком)
Comments (14)
ava
Фантом | 22.09.2013, 12:47 #
Проще сразу привести примерчик - функцию scanf. Она именно это и делает.
ava
akizelokro | 22.09.2013, 19:31 #
Наиболее известный для постSTL'ного поколения С++-программистов пример возврата значения по ссылке - переопределение оператора "<<" в потоках.
Вернуть более одного значения в С/C++ не может. Но гибкость языка позволяет решать эту задачу косвенными способами:
-изменять значения объектов, переданных в функцию по указателю или по ссылке
-глобальные переменные
-либо переменные в области видимости (пример - функция-метод класса изменяет значения членов класса-данных
-возвращать объект (юнион, класс, структуру, массив, выделенную область памяти, заполненую и т.д.), либо указатель на подобный объект, либо посредством ссылки на объект.
Так что нужно именно?
ava
volatile | 22.09.2013, 21:51 #
Цитата (ioManip @  22.9.2013,  06:24 findReferencedText)
как вернуть из функции более одного значения?

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

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 значения
}
ava
volatile | 22.09.2013, 22:18 #
Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair
ava
feodorv | 22.09.2013, 22:23 #
Цитата (akizelokro @  22.9.2013,  20:31 findReferencedText)
Так что нужно именно?

Цитата (ioManip @  22.9.2013,  07:24 findReferencedText)
при помощи ссылок



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

?
ava
akizelokro | 23.09.2013, 00:38 #
Цитата (feodorv @  22.9.2013,  22:23 findReferencedText)
Цитата(akizelokro @  22.9.2013,  20:31 Найти цитируемый пост)

Так что нужно именно?


Написано, как вернуть из функции. Я и поинтересовался. Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.
ava
akizelokro | 23.09.2013, 02:15 #
Цитата (volatile @  22.9.2013,  22:18 findReferencedText)
Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair 


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


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


Но я так и не понял, что именно нужно из самого вопроса.
ava
ioManip | 23.09.2013, 04:34 #
Цитата (akizelokro @  23.9.2013,  02:15 findReferencedText)
Но я так и не понял, что именно нужно из самого вопроса.

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

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

Я тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам.
ava
akizelokro | 23.09.2013, 05:05 #
Цитата (ioManip @  23.9.2013,  04:34 findReferencedText)
 тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам. 


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

Вообщем, я тебе ещё больше могу только усложнить, Возвращение значения по ссылке


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

Вы уж больно придираетесь к словам. Всю жизнь говорили о значениях, передаваемых из вызванной функции в вызывающую по ссылке или по адресу, как о возвращаемых значениях, а тут вот нельзя почему-то.
Цитата
Аналогично программа может возвращать только одно значение. Если же логика требует нескольких, некоторые параметры объявляются ссылками, чтобы функция могла непосредственно модифицировать значения соответствующих фактических аргументов и использовать эти параметры для возврата дополнительных значений, либо некоторый класс или контейнер, содержащий группу значений, объявляется типом, возвращаемым функцией.
ava
akizelokro | 23.09.2013, 05:34 #
Цитата (feodorv @  23.9.2013,  05:16 findReferencedText)
Цитата(akizelokro @  23.9.2013,  01:38 Найти цитируемый пост)

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



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


Я не придираюсь, я просто переспросил. Меня вдруг в памяти что-то торкнуло, что там что-то есть ещё. А дальше мне поставили минус за вроде бы правильно написанный спич и в любом случае, я долго не работал, и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства.
ava
feodorv | 23.09.2013, 08:52 #
Цитата (akizelokro @  23.9.2013,  06:34 findReferencedText)
и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства

 smile Это да, когда я впервые познакомился с этим трюком, было приблизительно так, как описано здесь:
Цитата
метод, стоящий слева от знака равенства, обычно повергает человека, читающего код, в пятиминутное шоковое состояние.
 Статья 95-го года, а сейчас-то все с этим трюком знакомы smile 
ava
akizelokro | 23.09.2013, 16:38 #
Ладно, чёрт с ним с минусиком, у меня задачи другие.

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

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

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


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

Единственное условие, что время жизни объекта должно быть дольше существования функции (можно возвращать глобальную переменную или параметр, переданный в функцию по ссылке, либо же, возможно, приравнивать возвращаемое значение константной ссылке. Осталось только определить, действительно ли так воспринимает этот термин составитель задачи.
ava
feodorv | 24.09.2013, 15:59 #
Цитата (akizelokro @  23.9.2013,  17:38 findReferencedText)
Осталось только определить, действительно ли так воспринимает этот термин составитель задачи.

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

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit