![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Rickert |
|
||||||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Есть класс:
От него наследую:
Описание второго:
Создаю два объекта aPacketIni и присваиваю один другому. Сам процесс присваивания проходит правильно, но после этого вызывается деструктор aPacketIni объекта, которому присваивали значение. Почему? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Rickert
Видимо потому что оператор присваивания возвращает обьект по значеню а не по ссылке |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Да, так и есть. Тогда я не понимаю почему у меня второй класс работает нормально. Пошёл искать ошибку. Спасибо!
solved -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Как создаёте: в стеке или в куче?
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
А рекурсии почему не возникает? По return (*this); объект должен скопироваться в место, предоставленное вызвавшей функцией для помещения результата, а для этого должен быть вызван оператор копирования.
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
вы случайно не путаете конструктор копирования с оператором присвоения? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Понятно. По return (*this); создаётся новый объект с помощью копирующего конструктора (а не оператора копирования), поскольку было выделено место для объекта, а объект ещё был не создан. Поскольку копирующий конструктор не определён, компилятор создаст его сам (причём неправильный - скопруется указатель data, а не будет выделятся новая память). Таким образом, у двух объектов будут одинаковые data. После выхода из оперетора копирования, поскольку результат операции никуда не присваивается и больше не нужен, вызывается деструктор и data удаляется. В скопированном объекте data указывает на удалённую память.
Вывод: 1. operator=() должен возвращать ссылку или ничего, его агрумент тоже должен быть ссылкой (но возможны исключения) 2. Вместе с operator=() нужно создавать копирующий конструктор, чтобы они работали согласованно. |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
math64
1. Для класса автоматически буду сгенерированы (если они нужны и если они не написаны пользователем)
3. Если вам понадобилось явно написать копирующий конструктор или оператор присваивания - скорее всего нужно написать все 4. Вот в принципе базовые правила для так называемой "Большой четверки" |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
а я знаю большую тройку. и дефолт конструктор в ней не обязателен.
Это сообщение отредактировал(а) zim22 - 20.4.2009, 14:57 |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А где я писал что обязателен? |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
zim22
разницы нет? |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
azesmcar, любите же вы придираться к словам
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я? Конструктор скорее всего понадобится потому что если в классе есть что копировать или присваивать (причем не тривиально а нужен для этого свой оператор/копирующий конструктор) то скорее всего нужен конструктор чтобы его проинициализировать. Это может и не быть дефолт конструктор, но какой-то понадобится. Это типа рекомендации над чем надо задумываться когда пишешь и вовсе не означают что они обязательны. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |