Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка создания объекта в конструкторе, без использования throw

401
05 сентября 2007 года
Br@in RIPper
289 / / 15.02.2003
Как запретить, без использования throw, создание класса, если в его конструкторе обнаруживается, что он не может быть создан?

Например имеется такой код:

 
Код:
class CFile
{[INDENT]public:[/INDENT][INDENT][INDENT]CFile(LPCWSTR lpszFile);[/INDENT][/INDENT][INDENT]private:[/INDENT][INDENT][INDENT]FILE *m_File;[/INDENT][/INDENT]};

CFile::CFile(LPCWSTR lpszFile)
{[INDENT]m_File = fopen(lpszFile, "r");[/INDENT][INDENT]if (m_File == NULL)[/INDENT][INDENT][INDENT]throw;[/INDENT][/INDENT]}

int main()
{[INDENT]CFile *File = NULL;[/INDENT][INDENT][/INDENT][INDENT]try[/INDENT][INDENT]{[/INDENT][INDENT][INDENT]File = new CFile("c:\test");[/INDENT][/INDENT][INDENT]}[/INDENT][INDENT]catch(...)[/INDENT][INDENT]{[/INDENT][INDENT]}[/INDENT][INDENT]return 0;[/INDENT]}


Можно ли без использования throw получить File == NULL, если файл не удалось открыть?

Сразу отвечу на вопрос, почему именно без "throw" - программа должна собираться без стандартной библиотеки (libc.lib)
8.9K
05 сентября 2007 года
Kulti
77 / / 29.07.2006
А файл в конструкторе обязательно открывать? Может просто подругому логику программы сделать?
P.S. ни разу сам не пробовал, но может просто оператор new перегрузить, если психически здоровывй код никак нельзя написать?
12K
05 сентября 2007 года
__AleXX__
133 / / 02.04.2007
Что ты под этим: "File == NULL" имеешь в виду?

Можно, я думаю, только объект все равно будет создан.
Просто можно будет написать какой-нибудь враппер (вокруг этого класса) , короче: это надо смотреть исходя из твоих целей.
3
05 сентября 2007 года
Green
4.8K / / 20.01.2000
Цитата: Br@in RIPper
Как запретить, без использования throw, создание класса, если в его конструкторе обнаруживается, что он не может быть создан?

Можно ли без использования throw получить File == NULL, если файл не удалось открыть?



Kulti прав по поводу открытия файла внутри конструктора. Зачем?
Посмотри, как работает fstream. Либо вызывается спец. метод open возвращающий bool, либо производится попытка открытия в конструкторе, а результат проверяется с помощью метода is_opened или operator bool.

Если же брать общий случай, когда объект должен быть или не быть создан по каким-то правилам, то лучше использовать фабрику объектов.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог