А можно ли бросать исключения из конструктора?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

И будет ли в этом случае объект корректно создан?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Можно и память будет освобождена автоматически, но деструкторы не до конца сконструированных подобъектов не будут вызваны включая деструктор того объекта где собственно и произошло исключение в конструкторе.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А обращаться к нему имеет смысл?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

К кому обращаться?
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

К объекту. Есть класс, в нём конструктор, некоторые члены класса сами являются объектами. Исключение брошено в конструкторе после задания значений всех членов. Часть членов специально предназначена для подробной информации об ошибке, а один член - о факте ошибки. Имеет ли смысл после исключения обращаться к функциям-членам и операторам-членам, инкапсулирующим доступ к членам с информацией об ошибках?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Если брошено исключение в конструкторе, то объекта и не было никогда.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

То есть? И как тогда перед обращении к нему проверить валидность? Или всё таки в конструкторе нельзя?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Очевидно что если во время конструирования не было исключений, то объект валиден. А если были, то ты не имел никакого способа получить ссылку на этот объект.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

То есть?

Код: Выделить всё

A a(x);
if ((bool)a)
{
}
. Это написано на этапе разработки, а исключение брошено при исполнении.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Недеюсь мне не надо объяснять, что если в конструкторе а брошено исключение, то на if ты не попадешь. Попадешь на ближайший подходящий catch() выше по стеку.
2B OR NOT(2B) = FF
Ответить