Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Rhoads
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 2
#1

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

18.10.2013, 03:42. Просмотров 646. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2013, 03:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат и присвоение объекта из функции без копирования (C++):

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

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

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

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

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

Почему не вызывается конструктор копирования при возврате объекта из функции - C++
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2013, 03:53 #2
у Вас функция func_B возвращает указатель, а Вы его объекту пытаетесь присвоить.
C++
1
some_struct_type S1 = func_B();
можете в funcA сделать указатель:
C++
1
some_struct_type * S1 = func_B();
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
18.10.2013, 09:16 #3
Цитата Сообщение от Rhoads Посмотреть сообщение
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике?
да можно возвращайте ссылки или указатели, только будьте внимательнее - не забывайте что в ф-ции, в зависимости от того как объявлен объект он по выходу из ф-ции может удалиться
0
Rhoads
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 2
18.10.2013, 20:15  [ТС] #4
Цитата Сообщение от 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
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 02:28 #5
Если так:
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
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
19.10.2013, 02:43 #6
std::move или что надо?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
19.10.2013, 02:51 #7
Цитата Сообщение от Rhoads Посмотреть сообщение
some_struct_type(some_struct_type *S2)
{
* * // копируем нужные данные из S2 в this
* * this->param1 = S2->param1;
// удаляем S2
* * delete S2;
};
Верно лишь если S2 выделена динамически. Ну как верно, вот S2 радости то будет узнать что его органы пошли на конструирование брата. Так делать нельзя. Вообще не осуществляйте в конструкторе ничего кроме конструирования нового объекта.

Можете использовать конструктор копий, если хотите. А может подойдет мув конструктор. Вы как-то неясно выражаетесь.
0
19.10.2013, 02:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 02:51
Привет! Вот еще темы с ответами:

Как такое может быть? (вызов функции-члена без объекта) - C++
собственно вопрос озвучен. #include <iostream> using namespace std; class Test { public: void print() {

Возврат объекта с полями-массивами в функцию - C++
Есть вот такой код: #include<iostream> using namespace std; const int MAX=9; class Money {

Виртуальная функция и возврат объекта класса - C++
Доброго времени суток! Столкнулся с проблемой. Есть переопределенный оператор умножения в родительском классе. virtual CComplex...

Конструктор копирования для динамического объекта класса приемника - C++
class first_class { public: first_class(int q) { m_q=q; cout<<"First class say HI"<<endl; } ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru