|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.12.2013, 16:33 | #1 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
Конструктор прсвоения класса, использующего new
Почему не могу использовать
MyClass instA = someFunction() или MyClass instA = instB? Ведь string st = retStr() прекрасно работает. Код:
Последний раз редактировалось Smogg; 03.12.2013 в 16:53. |
03.12.2013, 17:25 | #2 |
Форумчанин
Регистрация: 24.12.2012
Сообщений: 639
|
Вы не возвращайте локальный стековый объект для начала.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
|
03.12.2013, 17:38 | #3 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
А есть разница? Стд::стринги ж нормально возвращаются.
Сейчас у меня возвращается указатель на статичный объект, у которого есть перегруженный оператор=: ClsA operator=(ClsA * instAssgn); Но, блин, также есть и ClsA operator=(ClsA instAssgn); Это некрасиво, когда один и тот же оператор работает как с объектами, так и с указателями на оные... Отчего вместо аккуратного Код:
Код:
Последний раз редактировалось Smogg; 03.12.2013 в 18:23. |
03.12.2013, 18:18 | #4 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
Тадамммм!! Я все понял. Вот они, досадные плоды самообразования!
Тута должен быть явно описан конструктор копирования, иначе компилятор работает по дефолту: Код:
Последний раз редактировалось Smogg; 03.12.2013 в 21:31. |
04.12.2013, 09:09 | #5 |
Форумчанин
Регистрация: 13.11.2013
Сообщений: 149
|
Явно объявленный конструктор копирования решил проблему?
|
04.12.2013, 12:45 | #6 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
Ага)
Код:
|
04.12.2013, 13:22 | #7 |
Форумчанин
Регистрация: 13.11.2013
Сообщений: 149
|
Что по-вашему происходит в таком коде?
Код:
|
04.12.2013, 13:47 | #8 | |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
Цитата:
1. заходится в функцию ret() 2. в ней конструируется локальный объект a. 3. вызывается return a, каковой на самом деле означает вызов конструктора присваивания b(& a) 4. ипсполняемый код внутри функции закончился и начинается разрушение локальных объектов, т.е. вызов деструктора для а 5. выход из функции ret() 6. исполнение строчки кода, следующей за ClsA b = ret(); |
|
04.12.2013, 13:56 | #9 |
Форумчанин
Регистрация: 13.11.2013
Сообщений: 149
|
Почему-то мой компилятор такое не проглатывает.
1. Т.к. функция ret() возвращает не ссылку, а именно объект, компилятор требует определить конструктор ClsA(ClsA), но при его определении ругается, что такой конструктор создать нельзя 2. Если определить функцию ret() так, чтобы она возвращала ссылку, компилятор ругается на возврат локальной переменной. Т.е. ни в каком случае GCC-4.8.1 не позволяет вернуть локальный объект. Нет, вру. 2 случай лишь предупреждение, т.е. в принципе работает. Последний раз редактировалось nikmoon; 04.12.2013 в 14:04. |
04.12.2013, 14:07 | #10 |
Форумчанин
Регистрация: 13.11.2013
Сообщений: 149
|
И вообще оказалось достаточно объявить
Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса | Jugger | Помощь студентам | 3 | 05.01.2012 04:10 |
[c++] Создание класса. Используя конструктор. | Actimel | Помощь студентам | 2 | 03.01.2012 11:54 |
передача функции в конструктор класса | Kukurudza | Общие вопросы C/C++ | 6 | 04.12.2011 08:31 |
Конструктор шаблонного класса | Hemul | Общие вопросы C/C++ | 1 | 01.07.2011 20:21 |
Конструктор класса | XPAiN | Общие вопросы Delphi | 2 | 24.01.2010 15:00 |