Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 2

Возврат и присвоение объекта из функции без копирования

18.10.2013, 03:42. Показов 4267. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике?

Наверно не очень понятно выразился, вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// какой то тип данных
struct some_struct_type
{
    // тут какие-нибудь свойства и методы
};
 
// функция, где определена переменная типа some_struct_type
void func_A()
{
    some_struct_type S1 = func_B();
}
 
// функция, которая возвращает значение типа some_struct_type
some_struct_type *func_B()
{
    some_struct_type *S2 = new some_struct_type();
    return S2;
}
Требуется, чтобы данные объекта S2 не копировались в S1 (т.к. в этом случае получаем лишнее выделение памяти), а создавались СРАЗУ в области памяти, выделенной под данные S1 (но выполнялось это в другой функции).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2013, 03:42
Ответы с готовыми решениями:

Присвоение массива БЕЗ копирования
Добрый день. Есть двумерный массив: type TAAInt = array of array of integer; a:TAAInt; setlength(a,4,6); a:=, , , ...

Присвоение и Возврат значения из функции
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; //среднее Значение массива int size(int arr,int...

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный в стеке при этом копи конструктор публичный. ...

6
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.10.2013, 03:53
у Вас функция func_B возвращает указатель, а Вы его объекту пытаетесь присвоить.
C++
1
some_struct_type S1 = func_B();
можете в funcA сделать указатель:
C++
1
some_struct_type * S1 = func_B();
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
18.10.2013, 09:16
Цитата Сообщение от Rhoads Посмотреть сообщение
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике?
да можно возвращайте ссылки или указатели, только будьте внимательнее - не забывайте что в ф-ции, в зависимости от того как объявлен объект он по выходу из ф-ции может удалиться
0
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 2
18.10.2013, 20:15  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
у Вас функция func_B возвращает указатель, а Вы его объекту пытаетесь присвоить.
C++
1
some_struct_type S1 = func_B();
Естественно, пример не рабочий, т.к. мне непонятно как осуществить операцию.

Хотя мне удалось сделать работающую "затычку" - я добавил конструктор такого типа:
C++
1
2
3
4
5
6
7
8
some_struct_type(some_struct_type *S2)
{
    // копируем нужные данные из S2 в this
    this->param1 = S2->param1;
 
    // удаляем S2
    delete S2;
};
Но в этом случае как раз происходит двойное выделение памяти, чего я и хочу избежать.

Цитата Сообщение от Croessmah Посмотреть сообщение
можете в funcA сделать указатель:
C++
1
some_struct_type * S1 = func_B();
Это понятно, но нужно, что бы переменная была не ссылкой.
Тогда при выходе из функции будет автоматически вызываться деструктор объекта some_struct_type (для того и весь сыр бор ).
Это нужно, когда из функции несколько return'ов - в варианте со ссылкой придется перед каждым вставлять delete.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 02:28
Если так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// какой то тип данных
struct some_struct_type
{
    // тут какие-нибудь свойства и методы
};
 
// функция, которая возвращает значение типа some_struct_type
some_struct_type func_B()
{
    some_struct_type S2;
    return S2;
}
 
// функция, где определена переменная типа some_struct_type
void func_A()
{
    some_struct_type S1 = func_B();
}
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.10.2013, 02:43
std::move или что надо?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.10.2013, 02:51
Цитата Сообщение от Rhoads Посмотреть сообщение
some_struct_type(some_struct_type *S2)
{
* * // копируем нужные данные из S2 в this
* * this->param1 = S2->param1;
// удаляем S2
* * delete S2;
};
Верно лишь если S2 выделена динамически. Ну как верно, вот S2 радости то будет узнать что его органы пошли на конструирование брата. Так делать нельзя. Вообще не осуществляйте в конструкторе ничего кроме конструирования нового объекта.

Можете использовать конструктор копий, если хотите. А может подойдет мув конструктор. Вы как-то неясно выражаетесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2013, 02:51
Помогаю со студенческими работами здесь

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...

Возврат объекта из функции
Здравствуйте. Написал в Code.Blocks на C++ вот такой код (привожу только часть кода, остальное на мой взгляд излишне). class Soldier...

Возврат объекта Sprite из функции
Возврат объекта Sprite из функции. Подскажите, пожалуйста (всем привет). Есть функция: sf::Sprite Space() { sf::Image...

Возврат объекта класса из функции
Имеется следующий код: #include "stdafx.h" #include <iostream> using namespace std; /*Задача: Определить класс список...

Возврат моего объекта List из функции
Ребята, вот есть у меня такой List: template<class T> class List { public: typedef T* iterator; typedef const T*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru