Форум программистов, компьютерный форум CyberForum.ru

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

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

Создание объекта в функции и возврат объекта из нее - C++

20.08.2014, 15:56. Просмотров 669. Ответов 9
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Object{
   public:
      Object(){....}
      
      Object& someFunc(){
         Object a;
           //.....
         return a;
       }
 
       Object(const Object& ob){......}
 
   private: //.....
};
Сработает ли корректно someFunc() или же надо создавать объект в куче?

Добавлено через 1 минуту
Если мы сделаем что то типа этого

C++
1
2
3
Object a;
//.....
Object b = a.someFunc();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2014, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание объекта в функции и возврат объекта из нее (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++
Возможно ли в С++ вернуть объект (то есть записать данные объекта) напрямую в область памяти, выделенную в функции-приемнике? Наверно...

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Pingvinoff
61 / 61 / 12
Регистрация: 20.08.2014
Сообщений: 593
20.08.2014, 16:04 #2
Наверное лучше возвращать указатель на объект...
MishaMoix
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 99
20.08.2014, 16:06  [ТС] #3
Я это понимаю, но все же вопрос остается открытым
John Prick
778 / 711 / 131
Регистрация: 27.07.2012
Сообщений: 2,043
Завершенные тесты: 3
20.08.2014, 16:17 #4
Цитата Сообщение от Pingvinoff Посмотреть сообщение
Наверное лучше возвращать указатель на объект...
Ничуть не лучше, чем то, что предложил ТС.

MishaMoix, возвращать ссылку на локальный объект нельзя, так как после выхода из функции его уже не существует, а стало быть все ссылки и указатели на него недействительны.
Pingvinoff
61 / 61 / 12
Регистрация: 20.08.2014
Сообщений: 593
20.08.2014, 16:21 #5
John Prick, да ладно, а написать так:
C++
1
2
3
       Object* a = new Object(/*параметры*/);
       ...............
       return new Object(a);
При условии, что есть нормальный конструктор копирования
John Prick
778 / 711 / 131
Регистрация: 27.07.2012
Сообщений: 2,043
Завершенные тесты: 3
20.08.2014, 16:28 #6
Pingvinoff, ты здесь создал целых два объекта. Их, кстати, ещё нужно будет потом не забыть удалить.
Но дело не в этом, а в том, что ТС спрашивал нечто другое. Создание объекта динамически и возврат указателя на него - это не альтернатива возврату объекта из функции.
Цитата Сообщение от Pingvinoff Посмотреть сообщение
При условии, что есть нормальный конструктор копирования
При этом условии есть смысл возвращать объект по значению.
Pingvinoff
61 / 61 / 12
Регистрация: 20.08.2014
Сообщений: 593
20.08.2014, 16:41 #7
John Prick, я не посмотрел код.... только текст.
MishaMoix
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 99
20.08.2014, 19:34  [ТС] #8
Т.е либо
C++
1
2
3
4
Object& smFun(){
  Object *c = new Object()
  return *c;
}
либо

C++
1
2
3
4
Object someFuncz(){
  Oblect a;
  return a;
}
При этом нужен копи конструктор.
Так получается?
Andrej
И целого heap'а мало
94 / 55 / 9
Регистрация: 31.07.2014
Сообщений: 291
20.08.2014, 20:59 #9
MishaMoix, возвращай объекты по значению. Все приличные компиляторы оптимизируют такие дела на раз-два.
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
20.08.2014, 21:15 #10
Цитата Сообщение от MishaMoix Посмотреть сообщение
C++
1
2
3
4
Object& smFun(){ 
    Object *c = new Object() 
    return *c; 
}
В этом случае таки лучше возвращать указатель, а не ссылку.
C++
1
2
3
Object * smFun(){ 
    return new Object();
}
А вообще да. Объекты лучше по значению - а дальше RVO возьмется за дело.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 21:15
Привет! Вот еще темы с ответами:

Какие компонентные функции отвечают за создание объекта? - C++
Какие компонентные функции отвечают за создание объекта? Такой вопрос, может кто ответить?:) я не могу найти нигде...:(

Объявление класса, создание объекта и вызов функции-члена - C++
Всем добрый день! Вот так я объявляю класс. typedef map<string, double> datablock; typedef map<string, string> groupvars; ...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.08.2014, 21:15
Ответ Создать тему
Опции темы

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