![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Написал констуктор классу:
Хотелось бы узнать, что думает матерый С++ - гуру ? ;) Т.е. с высоты нескольких лет использования ++. Отмечу, что тут do - whihe нужен для того чтоб свести обработку и корректный откат в одно место! ;) |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
Это God-Constructor, разновидность God-Function
|
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
|
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
ISergeyN, Сделано было специально, потому что думаю что если передам char *, то ахтунг ) Может и ошибаюсь,
Пример, будет ли это работать с добавлением "&" ? : cDriver drvr("Cthulhu.sys"); или надо будет: cDriver drvr(std::string("Cthulhu.sys") ); ? Более, того. Вы предлагаете ссылку, а значит в конструкторе нужно ссылаться на конкретный объект! А что если перечислю список дров для тестировани из ини-файла и удалю их потом ,т.е. все будет в динамике, то на что ссылаться то? Потому мне кажется лучше по значению, а не ссылке ) |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
http://codepad.org/tPCL89kP |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EvilsInterrupt, стандартный способ передачи СЛОЖНЫХ объектов в качестве параметра - по константной ссылке. Твои страхи беспочвенны. у std::string конструктор от const char* не explicit, поэтому передавать строковые литералы можно.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Не советую выбрасывать исключения из конструктора - дурной тон
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
borisbn, Почему? То что не производительно по скорости выполнения согласен, но почему дурной тон? Если объект был должен создан, а он не создался, то что? Это разве просто ошибка? Нет! Это исключительная ситуация!
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
EvilsInterrupt, под руками нет отладчика (к сожалению не помню) чтобы проверить, вызовется ли в этом случае деструктор. А если и вызовется, то как ему удалять наполовину созданный объект. IMHO в ситуации, когда может произойти исключительная ситуация создать отдельную функцию инициализации.
Хотя, ладно, согласен, что и так можно. Просто у нас на фирме это - дурной тон (мы используем Qt, и потихоньку начинаем перенимать их стиль) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
мало того - опасно!
и еще пример
тут конечно можно использовать std::uncaught_exception(), но зачем это нужно?
Это сообщение отредактировал(а) azesmcar - 20.6.2010, 09:55 |
||||||
|
|||||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
эм... мне кажется или кто-то путает конструктор с деструктором?
ибо в деструкторе да, исключения бросать нельзя. а в конструкторе это единственно верный способ сообщить об ошибке. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
черт, написано конструктор, прочитал деструктор ![]() ну так мой пример про деструкторы ![]() Добавлено через 2 минуты и 12 секунд неправильно прочитал, исправляюсь ничего дурного в этом нет. ![]() |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>Это God-Constructor, разновидность God-Function
не совсем понял, что вы хотели сказать? ;) Намек на то что мне нужно поискать эти термины и после прочтения пойму, что мой конструктор подходит под то что пишут опытные С++-программеры? >>а в конструкторе это единственно верный способ сообщить об ошибке. это не только единственный, это лучше не придумаешь! Нахрена скажите человеку идти в магазин за хлебом, если он забыл дома кошелек? Если в мире людей еще можно надеяться, что кто-то пожалеет или даст в долг, то в мире программ надеяться на что-то никак нельзя! Если от чего-то зависит нарушение достижения основной цели программы, то это "чего-то" исключительная и мало того экстренная ситуация. Ошибку можно не проверить, а вот исключение оставить обработанным никак нельзя! >> под руками нет отладчика (к сожалению не помню) чтобы проверить, вызовется ли в этом случае деструктор. А если и вызовется, то как ему удалять наполовину созданный объект. Простите но бред! Объект или создается или не создается и объект считается созданным, только тогда, когда отработала не только секция инициализация конструктора, т.е. после двоеточия, но и само тело! 1) Деструктор будет вызван исключительно только у созданного объекта и никак иначе! 2) Для внутренних объектов деструктор вызывается не только, когда удаляется сам объект содержащий, но также и тогда, когда не завершилось тело конструктора,к примеру бросили исключение в тело и после обработки его, решено удалить, тогда произойдет откат создания внутренних, за исключением действий по выделению ресурсов в теле конструктора 3) Для этого нужно все что выделил удалить самому! >>cDriver::cDriver(const std::string &filename) учту спасибо!!! Но к вам вопрос. Что если я хочу в методе вернуть std::string, как лучше это осуществить? По значению, по указателю или ссылке на созданный внутри спомощью new ? Это сообщение отредактировал(а) EvilsInterrupt - 20.6.2010, 11:13 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Output:
http://codepad.org/knrUAMBO Это сообщение отредактировал(а) borisbn - 20.6.2010, 10:58 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
borisbn, С какой целью вы привели свой код? ;) Если просто показать, что ничего такого в бросании ислкючений в конструкторе, то по-моему уже два поста, + мой сегодняшний говорят о том что :
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |