Задать вопрос

Аварийное прекращение создания объекта из класса, который является родителем?

Есть некий родитель, который делает в своем конструкторе что то вроде (не знаю, хороший ли вариант)
if (something()) {
    return;
}

И есть класс, который наследуется от него:
class Child : public Parent {
    Child() {
        std::cout << "Child constructor";
    }
}

Что логично, никакого выхода не происходит, тк вызывается второй конструктор
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Чтобы "аварийно завершить" конструктор предка так, чтобы конструктор наследника не вызывался вообще, надо бросить исключение.

Второй варинат: флаг инициализации в предке. В начале конструктора выставляйте его в false. В конце удавшегося конструктора выставляйте этот флаг в true. В конструкторах наследников надо сначала убедится, что инициализация предка удалась. Потом в вызывающем коде можно проверить, что класс проинициализировался, посмотрев на этот же флаг.

Но этот метод не так легко обобщается на цепочки наследников. Надо чтобы все они одинаково интерпретировали этот флаг и меняли его при неудачной инициализации.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Так return - это не выход из программы. Это выход из функции.
Ответ написан
@dima20155
you don't choose c++. It chooses you
Ответ Wataru хорош, хотел бы только дополнить, что если вам необходимо необходимо кидать исключения в конструкторе класса, то скорее всего, у вас не самая лучшая архитектура. Прежде всего потому что при мало мальски сложной логике конструктора у вас будут проблемы с тем, что деструктор не будет вызван (так как конструктор не был выполнен до конца).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы