![]() |
|
Модераторы: bsa |
![]()
|
|
| EvilsInterrupt |
|
||||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Для того чтобы пояснить какая у меня в основном проект, я создал поменьше "школьный" вариант.
Файл header1.h содержит:
Файл implement1.cpp содержит:
В результате получаю:
инклуд memory подключен! Самое прикольно создается exe-файл и при отладке отрабатывает конструктор, а деструктор не пашед и я вижу строчку на экране: 0 : CPrivate1 constructor т.е. компилятор класс как бы находит, однако почему же он деструктор не осилил ? подобное можно найти и тут |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
auto_ptr должно знать полный класс (определение), а не только его объявление..
|
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
mes, Ну как бы директива препроцессора #include вставляет файл и полная единица компиляции. Чего не так-то ? Форвард-декларация должна быть форвардом, а не муляжом!
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
EvilsInterrupt, прямо скажем ничего она вам не должна.
Есть есть сомнения в ее поведении - почитайте стандарт. Попробуйте написать тот же код, без include, руками собрав все в 1 файл |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так он и есть форвард.. сравните ситуации
Добавлено @ 09:29 #include тут вообще сбоку.. речь о наличии определения в нужный момент. Это сообщение отредактировал(а) mes - 24.6.2010, 09:29 |
||||
|
|||||
| EvilsInterrupt |
|
||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
>>сравните ситуации
При таких , согласен! ;) Но, давайте взглянем на std::auto_ptr:
Напишем с указателем в явном виде:
Почему-то сейчас уже деструктор находится! А код не изменился,разве что в деструктор ~CMain() добавил удаление m_Private |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
У тебя же реализация в cpp. В этом случае он уже "знает" деструктор. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну а теперь подумайте, где в первом примере формируется деструктор у auto_ptr в котором вызыватся delete содержимого.. Добавлено @ 09:52
во во.. ) а теперь перенесите его внутрь класса Это сообщение отредактировал(а) mes - 24.6.2010, 09:52 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
вроде понял ) Но тогда получается pimpl не возможен на С++ с применением std::auto_ptr .
Просто меня очень бесит,когда инклуд содержит что-то относящееся к информации о реализации. На сях, всегда делал "чистые" инклуды, пользователь библиотеки знал только то что необходимо для использования библиотеки. А тут, разве что на чистых указателях можно ;) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
mes, пашед! Но тогда где освобождать ресурсы если не в деструкторе ?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не понял Добавлено через 2 минуты и 26 секунд или это Вы про ? так можете его полным сделать... суть не в этом.. главное чтоб определение деструктура было в точке, в которой все необходимое определено. Добавлено через 4 минуты и 5 секунд и еще раз внимательно перечитайте http://forum.vingrad.ru/index.php?showtopi...t&p=2174264 до понимания происходящего. |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Я к тому что, если в коде ниже, раскоментить, то ошибка :
А тело пустым, то все ок! Получается что в конструкторе получил ресурс, а в деструкторе его освобождение не могу прописать ;( нашел про pimpl в qt |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
я говорил про деструктор для CMain1.
Добавлено @ 10:30 деструктор Привателя к нашей задаче не относится.. Добавлено @ 10:34 кстати о auto_ptr .. Вы уверены что Вам нужна именно это стратегия хранения ? так как после этого объект класса, становится не copyable и его нельзя будет добавить например в вектор. Это сообщение отредактировал(а) mes - 24.6.2010, 10:35 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
mes, Ну по теме с конструктором, получил рекомендации создать класс хэндла, который будет создаваться в качестве приватного члена основного класса. Однако я не хочу,эту детализацию выкидывать в хидер, даже в виде декларации класса! Поэтому хочу создать pimpl и уже в файле реализации привести полную декларацию. У меня получается с указателями на форвард класс и дальнейшей его декларацией в файле реализации, но не получается с использованием std::auto_ptr.
>>я говорил про деструктор для CMain1. сделал. но та же самая ошибка! Да и цель-то, сделать открытие в конструкторе, а освобождение в деструкторе и при этом не вынося декларацию класса CPrivate1 в основной инклуд |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |