Чистый способ отменить создание объекта - PullRequest
4 голосов
/ 29 сентября 2011

Мне интересно, как остановить / отменить создание объекта, поднятого на new(). Может быть, если некоторые предварительные условия не выполняются и объект не нужен.

  • Проверка перед new?
  • Проверка внутри конструктора, возвращая null или что-то особенное, не знаю, как с этим справиться ...
  • Проверка после new была успешной и объект жив. Вызовите функцию-член myObj->Init(). И уничтожить объект, если это не удастся?

Ответы [ 4 ]

14 голосов
/ 29 сентября 2011

Ничего из перечисленного.

Если объект не может быть создан из-за невыполненных условий, конструктор должен выдать исключение с оператором throw.

4 голосов
/ 29 сентября 2011

Проверка перед new?

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

Проверка внутри конструктора, возвращение нуля или чего-то особенного, не знаю, как с этим справиться ...

Проверка внутриконструктор, и выбросить исключение.Обращайтесь с этим так же, как с любым другим исключением. Лучший подход.

Проверка после new была успешной и объект жив.Вызовите функцию-член myObj->Init().И уничтожить объект, если это не удастся?

Отказ RAII таким образом - шаг назад .

2 голосов
/ 29 сентября 2011

Создайте исключение для конструктора объекта. Обратите внимание, что деструктор объекта будет вызываться , а не , в отличие от operator delete, который будет вызываться автоматически для восстановления выделенной памяти.

0 голосов
/ 29 сентября 2011

Может быть, лучше сделать легкий конструктор, который всегда выполняется успешно, и функцию Initialize, которая выполняет тяжелую работу и выдает исключение при ошибке.

Редактировать . После некоторых критических отзывов я обнаружил, что мое предложение не соответствует требованиям RAII: «Ресурсы приобретаются во время инициализации, когда нет возможности использовать их до того, как они станут доступны».

Я не изменяю свой исходный пост, может быть полезно иметь это как типичный пример ошибки проектирования.

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