Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> auto_ptr & PIMPL idiom 
V
    Опции темы
IKM2007
Дата 8.7.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: нет
Всего: 40



Доброго дня. Допустим есть следующие классы

SimpleClass.h
Код


#include <iostream>
class SimpleClass
{
public:
    SimpleClass()
    {
        std::cout<<"constructor\n";
    }
    ~SimpleClass()
    {
        std::cout<<"destructor\n";
    }
};


ClassOwner.h
Код

#include <memory>
class ClassOwner 
{ 
public:  
ClassOwner(); 
private: 
class SimpleClass;
std::auto_ptr<SimpleClass> m_impl;
};


ClassOwner.cpp
Код

#include "ClassOwner.h" 
#include "SimpleClass.h" 
ClassOwner::
ClassOwner():  m_impl(new SimpleClass) { }


тогда при выполнении следующего кода


main.cpp
Код

#include "ClassOwner.h" 
int main() 
{ 
ClassOwner o; 
return 0; 
}


получим вывод:
constructor

Как я понимаю дело происходит так? Компилятор смотрит на обьявление класса ClassOwner, видит что там нету деструктора и генерирует свой деструктор по умолчанию. В генерированном деструкторе он "должен" вызвать деструкторы всех членов класса, то есть в нашем случае деструктор auto_ptr<SimpleClass>. НО он пока что не знает что из себя представляет SimpleClass, следовательно не может даже вызвать деструктор auto_ptr, следовательно не будет вызван также деструктор SimpleClass-а? Или он все таки в силах конструировать деструктор auto_ptr, но во время delete-а в деструкторе auto_ptr не может найти destructor для неполного типа? Какой из этих вариантов правильный? Или же все совсем иначе?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 8.7.2012, 11:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



IKM2007, 
при использовании авто_птр в овнере нужно определить (пустой) деструктор, там где есть уже полное описание импла.. и еще о копи-конструкторе следует позаботиться..

Добавлено через 3 минуты и 2 секунды
Цитата(IKM2007 @  8.7.2012,  10:24 Найти цитируемый пост)
 Или он все таки в силах конструировать деструктор auto_ptr, но во время delete-а в деструкторе auto_ptr не может найти destructor для неполного типа? Какой из этих вариантов правильный? 

да, это проблема не самого ауто_птр, а делете для неполного типа.. 



--------------------
PM MAIL WWW   Вверх
IKM2007
Дата 8.7.2012, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: нет
Всего: 40



Цитата(mes @  8.7.2012,  11:34 Найти цитируемый пост)
при использовании авто_птр в овнере нужно определить (пустой) деструктор, там где есть уже полное описание импла.. и еще о копи-конструкторе следует позаботиться..

Чтобы компилятор не создал свой деструктор ДО просмотра реализации этого класса, следовательно до полного определения impl-а?

И все таки
Цитата(IKM2007 @  8.7.2012,  11:24 Найти цитируемый пост)
он пока что не знает что из себя представляет SimpleClass, следовательно не может даже вызвать деструктор auto_ptr, следовательно не будет вызван также деструктор SimpleClass-а? Или он все таки в силах конструировать деструктор auto_ptr, но во время delete-а в деструкторе auto_ptr не может найти destructor для неполного типа? Какой из этих вариантов правильный?


Добавлено через 6 минут и 3 секунды
Цитата(mes @  8.7.2012,  11:34 Найти цитируемый пост)
и еще о копи-конструкторе следует позаботиться..

А если не определить копи-конструктор, он в сгенерированном даст ошибку или не сделает ничего?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 8.7.2012, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(IKM2007 @  8.7.2012,  10:38 Найти цитируемый пост)
А если не определить копи-конструктор, он в сгенерированном даст ошибку или не сделает ничего? 

ну так у ауто_птр есть же копи-конструктор.....

Добавлено через 1 минуту и 20 секунд
Цитата(IKM2007 @  8.7.2012,  10:38 Найти цитируемый пост)
Чтобы компилятор не создал свой деструктор ДО просмотра реализации этого класса, следовательно до полного определения impl-а?

ага, с целью чтоб делете деструктора ауто_птр знала о импле..


--------------------
PM MAIL WWW   Вверх
IKM2007
Дата 8.7.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: нет
Всего: 40



Цитата(mes @  8.7.2012,  11:50 Найти цитируемый пост)
ну так у ауто_птр есть же копи-конструктор.....

Да

Код

auto_ptr (auto_ptr& rhs) throw() 
        : ap(rhs.release()) {
      }

tempiate<class Y>
      auto_ptr (auto_ptr<Y>& rhs) throw() 
        : ap(rhs.release()) { }


Тогда все должно быть нормально, так как он просто передаст указатель на обьект новому auto_ptr.

Добавлено через 48 секунд
Тогда зачем нам переопределить копи-конструктор?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 8.7.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(IKM2007 @  8.7.2012,  11:08 Найти цитируемый пост)

Тогда зачем нам переопределить копи-конструктор? 

потому что семантика копирования ауто_птр отличается от той, которая требуется в большинстве случаев и является ожидаемой.. 

Цитата(IKM2007 @  8.7.2012,  11:08 Найти цитируемый пост)
тогда все должно быть нормально, так как он просто передаст указатель на обьект новому auto_ptr.

а что будет со старым ? как его использовать ?

Это сообщение отредактировал(а) mes - 9.7.2012, 11:35


--------------------
PM MAIL WWW   Вверх
IKM2007
Дата 8.7.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: нет
Всего: 40



Цитата(mes @  8.7.2012,  12:18 Найти цитируемый пост)
потому что семантика копирования ауто_птр отличается от токой которая требуется в большинстве случаев и является ожидаемой.. 

Ладно понял. Спасибо! smile 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.