Может ли конструктор вернуть значение NULL? - PullRequest
29 голосов
/ 18 мая 2010

Я знаю, что конструкторы ничего не "возвращают", но, например, если я вызываю CMyClass *object = new CMyClass(), есть ли способ сделать объект пустым, если конструктор не работает? В моем случае у меня есть несколько изображений, которые нужно загрузить, и если чтение файла не удается, я бы хотел, чтобы оно возвращало ноль. Есть ли способ сделать это?
Заранее спасибо.

Ответы [ 15 ]

0 голосов
/ 19 мая 2010

Исключения - ваша лучшая ставка.

Вы также можете проверить значение errno, если вы программируете в среде Unix.

0 голосов
/ 18 мая 2010

Вы можете использовать malloc вместо new, так как malloc не генерирует исключения. Вам придется проверить результат malloc, прежде чем использовать указатель. Также, если malloc успешно, вам придется инициализировать объект.

Внимание:

malloc не вызывает конструктор объекта.

0 голосов
/ 18 мая 2010

На самом деле вы можете заставить new «возвращать» 0, используя std :: nothrow, но это только заставляет его возвращать 0, если выделение памяти не удается. Как только он попадет в ваш конструктор, вы не сможете получить то, что хотите.

Вы должны разделить проблемы в вашем классе. Конструктор почти никогда не должен (у меня возникает искушение сказать «никогда», но я оставляю место для редкого исключения, о котором я не могу думать) выполнять обработку файлов, если только обработка файлов не является его единственной ответственностью (например, fstream). *

0 голосов
/ 18 мая 2010

В Visual C ++ 6 стандартное поведение при нехватке памяти заключалось в том, что новый оператор возвращал NULL, а не генерировал исключение. Такое поведение не было стандартизировано позднее в C ++ и не было идиоматическим в современном C ++.

Но вы, безусловно, можете создать версию оператора new, которая будет вести себя таким образом, если вы того пожелаете, или использовать вариант nothrow: if ( Foo * foo = new ( std::nothrow ) Foo ) { ... }.

0 голосов
/ 18 мая 2010

Вы не должны выполнять такую ​​работу в конструкторе. Конструкторы должны выполнить минимальный объем работы, чтобы сделать объект пригодным для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...