Завершение рефакторинга простого класса

Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.

Короткий ответ

Что ответить на собеседовании

Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.

Подробный разбор

Ответ с пояснениями

Условие

Дан фрагмент программы, который должен печатать «true» или «false» в стандартный вывод в зависимости от результата, возвращаемого методом, выбранным в коде. Часть рефакторинга уже выполнена, но её необходимо довести до завершённого состояния.

# include <memory>
# include <iostream>
# define ALL_RIGHT 0

class Entity;

class TaskExecutor {
public:
    TaskExecutor() {
        entityPtr_ = new Entity;
    }

    bool performTask() {
        entityPtr_->callMethod();
        // TODO: вернуть корректный результат
    }

private:
    Entity* entityPtr_;
};

int main() {
    TaskExecutor executor;

    auto result = executor.performTask();

    std::cout << (result ? "true" : "false") << std::endl;

    return ALL_RIGHT;
}

Необходимо исправить конструктор и метод performTask, обеспечить правильное управление динамической памятью, а также гарантировать, что программа выводит нужное значение.

Ответ

Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.

Если реальный Entity::callMethod возвращает bool, после подключения его заголовка код может выглядеть так:

#include "Entity.h"
#include <memory>

class TaskExecutor {
    std::unique_ptr<Entity> entityPtr_;
public:
    TaskExecutor() : entityPtr_(std::make_unique<Entity>()) {}
    bool performTask() {
        return entityPtr_->callMethod();
    }
};

Исходный Entity не приведён, поэтому заранее определить true или false нельзя. Если callMethod возвращает код ошибки, преобразование в bool нужно задать по его контракту, а не угадывать по наличию макроса ALL_RIGHT.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее