Назад к задачам
Junior — Senior
5

Определение консольного вывода программы 2

Компании, где спрашивали:

СБЕР ДискСБЕР Диск
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Найдите все логические и технические ошибки в приведённом фрагменте кода и укажите, какой текст будет напечатан в консоль при его запуске.

# include <deque>
# include <exception>
# include <iostream>

constexpr int x = 2;

struct A {
    int* _x;

    A() {
        _x = new int();
        doInitWork();
    }

    ~A() {
        std::cout << "~A\n";
        delete _x;
    }

    void doInitWork() {
        *_x = x;
        afterInit();
        std::cout << "A initialized. X = " << *_x << std::endl;
    }

    virtual void afterInit() { }
};

struct B : A {
    int* _multiplier;

    B(int multiplier)
        : _multiplier { new int { multiplier } } {
        if (multiplier >= 3)
            throw std::runtime_error("multiplier must be less then 3");
    }

    ~B() {
        std::cout << "~B\n";
        delete _multiplier;
    }

    void afterInit() override { *_x *= *_multiplier; }
};

int main(int argc, char* argv[]) {
    std::deque<A*> objects;

    try {
        for (int x = 2; x < 4; ++x) {
            objects.push_back(new B { x });
            std::cout << "B created with multiplier = " << x << std::endl;
        }
    } catch (const std::exception& e) {
        std::cout << "exception: " << e.what() << std::endl;
    }

    for (auto&& obj : objects)
        delete obj;

    return 0;
}