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
Например имеется такой код:
Код:
Можно ли без использования throw получить File == NULL, если файл не удалось открыть?
Сразу отвечу на вопрос, почему именно без "throw" - программа должна собираться без стандартной библиотеки (libc.lib)
P.S. ни разу сам не пробовал, но может просто оператор new перегрузить, если психически здоровывй код никак нельзя написать?
Можно, я думаю, только объект все равно будет создан.
Просто можно будет написать какой-нибудь враппер (вокруг этого класса) , короче: это надо смотреть исходя из твоих целей.
Цитата: Br@in RIPper
Как запретить, без использования throw, создание класса, если в его конструкторе обнаруживается, что он не может быть создан?
Можно ли без использования throw получить File == NULL, если файл не удалось открыть?
Можно ли без использования throw получить File == NULL, если файл не удалось открыть?
Kulti прав по поводу открытия файла внутри конструктора. Зачем?
Посмотри, как работает fstream. Либо вызывается спец. метод open возвращающий bool, либо производится попытка открытия в конструкторе, а результат проверяется с помощью метода is_opened или operator bool.
Если же брать общий случай, когда объект должен быть или не быть создан по каким-то правилам, то лучше использовать фабрику объектов.