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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор в стиле ООП или нет? 
:(
    Опции темы
borisbn
Дата 20.6.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



EvilsInterrupt, с целью показать, что файл, открытый в конструкторе дочернего объекта FileOpener, не закроется, если выбросить исключение из A:A().


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
EvilsInterrupt
Дата 20.6.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



>>EvilsInterrupt, с целью показать, что файл, открытый в конструкторе дочернего объекта FileOpener, не закроется, если выбросить исключение из A:A().
Дело в том что то что сделано до работы тела вашего конструктора, откатится само! ;) А все что сделано в вашем теле, вами в ручную так сказать, то в случае ошибки перед выбрасыванием исключения , вы должны откатить сами!!!
Об этом я и писал:
Цитата

2) Для внутренних объектов деструктор вызывается не только,  когда удаляется сам объект содержащий, но также и тогда, когда не завершилось тело конструктора,к примеру бросили исключение в тело и после обработки его, решено удалить, тогда произойдет откат создания внутренних, за исключением действий по выделению ресурсов в теле конструктора 3) Для этого нужно все что выделил удалить самому!

и:
Цитата

Отмечу, что тут do - whihe нужен для того чтоб свести обработку и корректный откат в одно место! ;)

PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 20.6.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



EvilsInterrupt, OK, судя по всему мы не прийдём к общему мнению, и каждый останется при своём. Мне кажется, что действия по удалению/очищению/откату следует делать в деструкторе, а не в конструкторе. Заметьте, что я не говорил, что нельзя выбрасывать исключения из конструктора, я лишь говорил, что это - дурной тон, причём с добавлением:
Цитата(borisbn @  20.6.2010,  06:48 Найти цитируемый пост)
Хотя, ладно, согласен, что и так можно. Просто у нас на фирме это - дурной тон (мы используем Qt, и потихоньку начинаем перенимать их стиль)

Предлагаю за сим hollywar закончить smile

Это сообщение отредактировал(а) borisbn - 20.6.2010, 12:32


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 20.6.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



P.S. Sorry за  smile 
ISergeyN, а как ты в своём первом посте выделил фон символа &


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
EvilsInterrupt
Дата 20.6.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



borisbn, Если излишне к Вам.. прошу простить. Просто люблю аргументацию, от которой не отвертеться ;) Из всего приведенного мною выше на ваши ответы, у меня только один ответ : Как вы поступаете , если выделены\получены\открыты ресурсы в теле конструктора , а под конец скажем из 5 успешных действий у вас вдруг отработали только 3, что тогда ?
PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 20.6.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(EvilsInterrupt @  20.6.2010,  12:53 Найти цитируемый пост)
Как вы поступаете , если выделены\получены\открыты ресурсы в теле конструктора , а под конец скажем из 5 успешных действий у вас вдруг отработали только 3, что тогда ?

Удаляю/отдаю/закрываю только те, для которых всё было успешно выделено.
Код
C::C() : p( 0 ), manager( 0 ), resource( 0 ) {  
    manager = getManager();
    if ( manager )
        resource = getResoure( manager );
    p = new P();
}
C::~C(){  
    delete p;
    if ( manager )
    {
        if ( resource )
            freeResource( manager, resource );
        freeManager( manager );
    }
}


Цитата(EvilsInterrupt @  20.6.2010,  12:53 Найти цитируемый пост)
Просто люблю аргументацию, от которой не отвертеться ;) 

Подписываюсь, но в случае, когда под аргументами есть неоспоримые доказательства. Согласен ? smile

Это сообщение отредактировал(а) borisbn - 20.6.2010, 13:40


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 20.6.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



EvilsInterrupt, почитайте про RAII



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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



>> EvilsInterrupt, почитайте про RAII
А это :
Код

cDriver::cDriver(std::string filename)
: m_hSCManager( OpenSCManagerA(NULL,NULL,SC_MANAGER_CREATE_SERVICE) ),
....
    if(!m_hSCManager) {
      error  = true;
      errtxt = "Open Service control manager failed";
      break;
    }
....
  if(error) {
    CloseServiceHandle(m_hSCManager);
    throw(driver_error(errtxt));
  }


не попадает под RAII ? Захват ресурса в точке инициализации, потом проверка ;) или чтото не так?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 20.6.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EvilsInterrupt @  20.6.2010,  13:01 Найти цитируемый пост)
не попадает под RAII ?

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

Код

// не RAII
int *p = new int[10];
delete p; 

// RAII
std::auto_ptr<int>  p ( new int[10] );


Добавлено через 1 минуту и 18 секунд
Цитата

Получение ресурса есть инициализация (англ. Resource Acquisition Is Initialization (RAII)) — шаблон проектирования объектно-ориентированного программирования, смысл которого заключается в том, что получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта.


http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%86%D0%B8%D1%8F


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


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Получение?
Вот:
Цитата

cDriver::cDriver(std::string filename)
: m_hSCManager( OpenSCManagerA(NULL,NULL,SC_MANAGER_CREATE_SERVICE) ),

совмещено с инциализацией!

>>а освобождение — с уничтожением объекта.
Деструктор не привел, тема про конструктор!!! То что не  приведено еще не означает, что не написано совсем,  но  спасибо за напоминание ;)

Это RAII ! т.к. получение в секции инициализации. Только одно многие забывают, что деструктор не будет вызван  , если тело вашего конструктора не отработало полностью!!! Таким образом бросая исключение вы лишаете себя работы деструктора и это означает, что именно вы берете на себя отвественность за освобождение ресурсов в случае некорректного создания объекта. Об этом-то я и писал выше в посте



PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 20.6.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



при бросании исключении в конструкторе деструктор для этого объекта действительно не будет вызван, но вот деструкторы членов объекта - будут

в данном случае, если бы m_hSCManager имел деструктор, в котором был вызов CloseServiceHandle, не пришлось бы вручную его вызывать ни в деструкторе, ни в обработке ошибки в конструкторе


--------------------
qqq
PM WWW   Вверх
EvilsInterrupt
Дата 20.6.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



>>но вот деструкторы членов объекта - будут
Об этом я и писал, вот:
Цитата

2) Для внутренних объектов деструктор вызывается не только,  когда удаляется сам объект содержащий, но также и тогда, когда не завершилось тело конструктора,к примеру бросили исключение в тело и после обработки его, решено удалить, тогда произойдет откат создания внутренних, за исключением действий по выделению ресурсов в теле конструктора 3) Для этого нужно все что выделил удалить самому!


>>в данном случае, если бы m_hSCManager имел деструктор, в котором был вызов CloseServiceHandle, не пришлось бы вручную его вызывать ни в деструкторе, ни в обработке ошибки в конструкторе
Да, согласен! Но в данной ситуации это не объект класса, а хэндл полученный в результате вызова Win32(Wow64) функции! Поэтому-то мне и надо откатываться самому вызовом CloseServicHandle, т.к. за меня никто этого не сделает !!!

PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 20.6.2010, 15:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EvilsInterrupt @  20.6.2010,  13:33 Найти цитируемый пост)
Это RAII ! т.к. получение в секции инициализации. Только одно многие забывают, что деструктор не будет вызван 

не туда смотрите.. речь не об объекте, конструктор которого Вы привели..в данном случае он нам не интересен.. Речь  о "технологии " примененной внутри конструктора .. При проектированнии в стиле RAII не пришлось бы так нагружать логику конструктора.. 
smile

Добавлено через 2 минуты и 2 секунды
Цитата(EvilsInterrupt @  20.6.2010,  14:07 Найти цитируемый пост)
Но в данной ситуации это не объект класса, а хэндл полученный в результате вызова Win32(Wow64) функции!

Так вместо того чтоб в каждом месте использовать сырой хэндл, легче в одном месте написать обертку - и сразу разгрузиться все остальное smile


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



EvilsInterrupt, это делается так:
Код
clas cDriver {
...
private:
   struct CSMHandle;
...
};

...

struct cDriver::CSMHandle
{
    CSMHandle() {
        handle_ = OpenSCManagerA(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
        if (!handle_)
           throw driver_error("Open Service control manager failed");
    }
    ~CSMHandle() {
       CloseServicHandle(handle_);
    }
    SC_HANDLE handle() { return handle_; }
private:
    SC_HANDLE handle_;
    //объекты нельзя копировать (у этих методов нет тела - это правильно)
    CSMHandle(const CSMHandle&);
    CSMHandle& operator=(const CSMHandle&);
};
Таким образом, если у тебя дойдет до конструктора объекта, содержащего объект класса CSMHandle, то значит handle валиден. В противном случае будет кинуто исключение.
PM   Вверх
kemiisto
Дата 20.6.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

Репутация: 2
Всего: 160



Цитата(EvilsInterrupt @  19.6.2010,  21:38 Найти цитируемый пост)
Отмечу, что тут do - whihe нужен для того чтоб свести обработку и корректный откат в одно место! ;) 

Ни Макконнелла, случайно, начитались?




--------------------
PM MAIL WWW GTalk Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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