Здравствуйте, Мурлакотам, Вы писали:
М>Вполне грамотный рефакторинг. Без вмешательства в код, использующий FatalException(), удалось добиться ожидаемого поведения предельно малой кровью.
По-моему, это ужасно.
Есть вполне понятная ошибка, которую надо было бы исправить, вместо этого такой забавный костыль.
Кстати, я не знаю C++, это нормально, кидать исключение в конструкторе, да еще отдавая указатель на недосозданный объект? ;)
Здравствуйте, midcyber, Вы писали:
М>>Вполне грамотный рефакторинг. Без вмешательства в код, использующий FatalException(), удалось добиться ожидаемого поведения предельно малой кровью.
M>По-моему, это ужасно. M>Есть вполне понятная ошибка, которую надо было бы исправить, вместо этого такой забавный костыль.
M>Кстати, я не знаю C++, это нормально, кидать исключение в конструкторе, да еще отдавая указатель на недосозданный объект?
Кидать нормально.
Там не отдаётся указатель. *this — это сам объект, т.е. исключение кидается по значению.
Здравствуйте, midcyber, Вы писали:
M>Здравствуйте, Мурлакотам, Вы писали:
М>>Вполне грамотный рефакторинг. Без вмешательства в код, использующий FatalException(), удалось добиться ожидаемого поведения предельно малой кровью.
M>По-моему, это ужасно. M>Есть вполне понятная ошибка, которую надо было бы исправить, вместо этого такой забавный костыль.
M>Кстати, я не знаю C++, это нормально, кидать исключение в конструкторе, да еще отдавая указатель на недосозданный объект?
Недосозданности конечно можно избежать, если кидать новый объект, созданный специальным приватным конструктором, который не генерит исключений. Но тогда пропадет вся соль метода — "throw *this"
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Rostislav_Pro, Вы писали:
RB>Интересно, а если добавить конструктор копии с такой же реализацией ???
Наверно стек ляжет. А по хорошему, конструктор копий надо сделать, но чтобы исключений не бросал.
Здравствуйте, Alexander G, Вы писали:
A>>>Там не отдаётся указатель. *this — это сам объект, т.е. исключение кидается по значению. К>>... и происходит срезка!
AG>А если из деструктора бросать, срезки не будет!
Из деструктора можно не заморачиваться с throw *this, а тупо писать там terminate(). Ибо, чего уж.
Здравствуйте, Vamp, Вы писали:
V>Плохое решение. Во-первых, возвращается недосозданный объект. Во-вторых, теряется контекст исключения.
Ну если throw в финальном по иерархии классе, и после инициализации, то как бы ничего плохого не произойдёт. Конструктор копирования скопирует контекст, для исключений он обязан существовать, работать и не бросать.
Здравствуйте, Кодт, Вы писали:
К>... и происходит срезка!
Откуда тут срезка-то? Всё, что более выведенное ещё не сконструировалось!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexander G, Вы писали:
AG>А если из деструктора бросать, срезки не будет!
Во-первых, будет примерно такая же "срезка", как и в случае с конструктором. Так как всё более выведенное к моменту вызова деструктора уже разрушится.
Во-вторых, не будет работать по любому. Так как деструктор, в отличии от конструктора, всего один. Например он будет зваться и для копий объекта...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Во-первых, будет примерно такая же "срезка", как и в случае с конструктором. Так как всё более выведенное к моменту вызова деструктора уже разрушится.
Во-первых, насколько я понял, речь идёт о такой срезке:
Соответсвенно, для деструктора такой срезки не будет.
E>Во-вторых, не будет работать по любому. Так как деструктор, в отличии от конструктора, всего один. Например он будет зваться и для копий объекта...
Во-вторых, не думаю, что кто-то всерьёз воспримет моё сообщение
Здравствуйте, alzt, Вы писали:
M>>Кстати, я не знаю C++, это нормально, кидать исключение в конструкторе, да еще отдавая указатель на недосозданный объект?
A>Кидать нормально. A>Там не отдаётся указатель. *this — это сам объект, т.е. исключение кидается по значению.
по какому значению, если объект не сконструирован?
Тут позовется конструктор копирования, у которого в параметре будет ссылка, указывающая на несуществующий объект — UB при попытке использования.